2014-01-30 5 views
0

Я мог бы использовать некоторую помощь здесь, так как не могу понять, как получить эту логику так, как я хочу.Обработка запроса 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> 

Надеется, что не слишком запутанные. Любая помощь или указатели в правильном направлении будет принята с благодарностью!

ответ

0

Я могу полностью связать вашу ситуацию.

Таким образом, вам не нужно иметь две различные функции (в views.py). Есть одна функция для рендеринга и отображения страницы. Что-то вроде

if request.post and form.is_valid(): 
    ''' 
     search logic for the query 
    ''' 
    info = Fruitinfo...... (bannana) 
    return render(request, "find.html", {'form': form}) 
    elif form.errors : 
    return render(request, "find.html", {'form': form}) 
    else: 
    form = SearchForm() 
    return render(request, "find.html", {'form': form}) 

Так я обычно обрабатываю формы, и это работает нормально. Я знаю, что повторяющихся строк можно избежать, но чтобы лучше понять, я оставил это так.

Смежные вопросы