Я мог бы использовать некоторую помощь здесь, так как не могу понять, как получить эту логику так, как я хочу.Обработка запроса GET в логике формы Django
У меня есть основное приложение Django и Django CMS.
localhost/find
У меня есть виджет формы Django, который отображает выпадающее меню и кнопку отправки. Если в раскрывающемся меню ничего не выбрано и нажимается кнопка, я хочу, чтобы URL-адрес оставался на localhost/find
и отображалось сообщение об ошибке. Если условие выпадающего меню выполнено, я хочу отобразить страницу с URL-адресом localhost/fruit_info?selection=banana
и содержимое которого зависит от выбранного пользователем. Так, например, если пользователь выбирает «банан», я покажу страницу с информацией о бананах (тупой пример, я знаю. Но я надеюсь, что вы поняли эту идею).
Теперь, вместо того, что я хочу, чтобы это произошло, вот что происходит:
В localhost/find
страница загружается и отображается форма. Не выбирая ничего из выпадающего меню, я нажимаю кнопку, и мне требуется localhost/fruit_info?
, которая снова отображает точную форму. Вместо этого я хотел, чтобы он оставался на localhost/find
и отображал сообщения об ошибках.
Далее, если я что-то выберу и нажму кнопку, он приведет меня к localhost/fruit_info?selection=banana
(что хорошо, что означает, что отправляется запрос GET), но вместо отображения соответствующей информационной страницы банана она снова отображает форму ,
Так что помимо проблемы с отображением ошибок, еще один большой вопрос - как создать логику, определяющую, какую страницу фруктов отображать. Создать ли я для каждого в администраторе CMS?
Вот какой-то соответствующий код.
forms.py
from django import forms
class SearchForm(forms.Form):
fruit = forms.ChoiceField(choices=..., required=True)
views.py
def find(request):
form = SearchForm() # an unbound form
return render(request, "find.html", {'form': form})
def fruit_info(request):
form = SearchForm(request.GET) # a form bound to the GET data
if form.is_valid(): # the dropdown menu has an item selected
fruit_name = form.cleaned_data['fruit']
# it's this logic here that I'm unsure about. Do I return a separate page per fruit?
if fruit_name == "banana":
return render(request, "banana.html", {})
if fruit_name == "kiwi":
return render(request, "kiwi.html", {})
...
else: # if nothing selected
form = SearchForm() # an unbound form
return render(request, "find.html", {'form': form})
urls.py
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^find/', find),
url(r'^fruit_info/', fruit_info),
url(r'^', include('cms.urls')),
)
if settings.DEBUG:
urlpatterns = patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
url(r'', include('django.contrib.staticfiles.urls')),
) + urlpatterns
find.html
{% if form.errors %}
<div class="err">{{ form.errors }}</div>
{% endif %}
<form action="{% url "mysite.views.fruit_info" %}" method="GET"> #not sure if the action attribute is correct here
{{ form.fruit }}
<button>Find</button>
</form>
Надеется, что не слишком запутанные. Любая помощь или указатели в правильном направлении будет принята с благодарностью!