Форма Джанго не появляется

Я работаю над созданием веб-страницы с помощью формы, используя класс Django Form. Я включил некоторые примеры кода, но моя проблема в том, что я следовал документации Django и учебнику в Djangobook, но не могу заставить мою форму отображаться на странице.

forms.py

from django import forms

class ResearchForm(forms.Form):
    fam_choices = ...
    spec_choices = ...
    family = forms.ChoiceField(choices=fam_choices, required=True)
    species = forms.ChoiceField(choices=spec_choices, required=True)

views.py

from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render
from mysite.forms import ResearchForm

...

def research(request):
    if request.method == 'GET': 
        form = ResearchForm(request.GET)
        if form.is_valid():
            f = form.cleaned_data['family']
            s = form.cleaned_data['species']
            return render(request, 'thankyou.html', {})
    else: 
         form = ResearchForm() # an unbound form
    return render(request, "research.html", {'form':form})

research.html

...
<form action="/research/" method="get" name="researchform">
   {{ form.as_p}}
   <button>Submit</button>
</form>
...

На веб-странице отображается только кнопка, а не select теги, которые ChoiceField должен сделать.

РЕДАКТИРОВАТЬ:

Я отредактировал мой views.py к этому:

def research(request):
    form = ResearchForm(request.GET)
    if form.is_valid():
        return render(request, 'thankyou.html', {})
    else: 
        form = ResearchForm()
        return render(request, 'research.html', {'form':form})

РЕДАКТИРОВАТЬ 2:

urls.py

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include('cms.urls')),
)

if settings.DEBUG:
    urlpatterns = patterns('',
        (r'^' + settings.MEDIA_URL.lstrip('/'), include('appmedia.urls')),
    ) + urlpatterns

2 ответа

При первом отображении страницы будет вызвано первое условие:

if request.method == 'GET':

и поскольку форма недействительна, она нигде не передается, поэтому form переменная пуста.

Вместо GET там должен быть POST в обоих местах.

if request.method == 'POST': 
    form = ResearchForm(request.POST)

Не стоит проверять метод, а только валидность формы. Что-то вроде:

def research(request):
    form = ResearchForm(request.GET)
    if form.is_valid():
        f = form.cleaned_data['family']
        s = form.cleaned_data['species']
        return render(request, 'thankyou.html', {})
    else: 
        form = ResearchForm() # an unbound form
        return render(request, "research.html", {'form':form})

Таким образом, если запрос GET содержит действительные данные формы, отображается страница благодарности, а если нет, то форма отображается.

Другие вопросы по тегам