2014-01-27 44 views
0

我正在使用Django的Form類構建一個帶有窗體的網頁。我已經包含了一些示例代碼片段,但是我的問題是,我遵循Django文檔和Djangobook中的教程,但無法讓我的表單實際顯示在頁面上。Django窗體不出現

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> 
... 

只有按鈕將出現在該網頁,而不是標籤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) 
+0

感謝您的回覆。我改變了我的代碼,像你所描述的那樣閱讀'POST'。表單標籤的屬性仍然是'GET'。然後,我重新啓動了我的Apache並刷新了頁面,但仍然沒有顯示任何表單。還有其他建議嗎? – noblerare

+0

表單也應該是POST類型的。 – mariodev

+0

是的,我也嘗試過,但那也不起作用。有沒有辦法使用Django表單進行GET請求?由於這是一個POST請求,我添加了'{%csrf_token%}'這對我來說很好。我可以點擊提交按鈕並獲得適當的頁面......事實上,表單本身甚至沒有出現,這是什麼讓我感到困擾。 – noblerare

0

您不應檢查該方法,而只檢查表單的有效性。例如:

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請求包含有效的表單數據,則顯示「謝謝」頁面,如果沒有,則呈現表單。

+0

感謝您的回覆。我嘗試過,但目前爲止沒有。有些奇怪的事情正在發生。在我的'research.html'頁面上,不顯示任何表單。然後,當我點擊提交按鈕時,它似乎沒有在'views.py'中調用'research'功能,而是試圖訪問不存在的'/ research'網頁。我的HTML有什麼問題嗎? – noblerare

+0

在你的HTML中,你最好使用[URL標籤](https://docs.djangoproject.com/en/dev/ref/templates/builtins/#url)代替'/ research',而不是'/ research',因爲這正是您將表單指向的位置。 (更新:你可以發佈你的'urls.py'too?) – LaundroMat

+0

@LaundroMat,我用'urls.py'更新了我的問題。我還在form標籤的action屬性中加入了{%url「mysite.views.research%}」,現在我得到一個NoReverseMatch錯誤 – noblerare