2009-10-12 67 views
8

我對Django相當陌生,我使用的是Django 1.0。 我有這樣的:
forms.py:只有一個BooleanField的Django窗體

class MyForm(forms.Form): 
    extra_cheeze = forms.BooleanField(required=False, 
             initial=False, 
             label='Extra cheeze') 

views.py:

def order_something(request): 
    form = MyForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     # do stuff... 

的問題是,除非該複選框被選中的形式是無效的,所以似乎並不成爲從現場獲得虛假價值的一種方式。 據the docs我可以理解,它應該工作。它的作品,如果我添加一個CharField到我的表格...

我誤解了這裏的東西還是這是一個錯誤? (是的,我用Google搜索,但沒有發現任何相關的)

更新:正如@Dominic羅傑的建議,我嘗試添加一個隱藏字段
dummy = forms.CharField(initial='dummy', widget=forms.widgets.HiddenInput())
這使得形式有效。這種解決方法使我現在可以繼續前進,但它仍然會很有趣,知道我是否誤解了某些東西...

+0

呵呵。聽起來像是一個bug。你能解決它使用隱藏的領域? – 2009-10-12 11:59:34

+0

有幾個bug報告聽起來有點類似 - 請參閱http://www.google.co.uk/search?q=django+checkbox+forms+bug – 2009-10-12 12:01:19

+0

我會嘗試。我懷疑表單不喜歡空數據,因爲瀏覽器不會包含未選中複選框的字段。 – Niklas 2009-10-12 12:05:43

回答

8

我的問題中的代碼中存在一個錯誤。感謝@ d0ugal通過包含一個稍微不同的例子來幫助我發現它。問題在這裏:

form = MyForm(request.POST or None) # <- PROBLEM HERE!!!!!!!!!!!!!!!! 
if request.method == 'POST' and form.is_valid(): 
    # do stuff... 

的錯誤是,我認爲request.POST將評估爲true,如果它是一個職位。但由於瀏覽器不會發布任何未經檢查的複選框,並且這是唯一的字段,所以POST數據是一個空字典,其值爲False。這導致None被用作初始化數據,導致表單被解除綁定並且無效。
@ d0ugal的例子先做安全的事情並測試request.method。

4

這也適用於我在1.1,1.0.3和1.0(我有這三個虛擬環境設置)。我只在FireFox中測試過,所以如果它的瀏覽器問題是另一回事,但據我所知,它們都使用複選框處理POST數據。

下面是該項目的完整代碼,以便您可以在閒暇時進行復制,並與您的閒暇時間進行比較以查看差異。

在Ubuntu

$ django-admin.py startproject testing 
$ cd testing/ 
$ python manage.py startapp myfirst 

在myfirst app文件夾設置即可;

/myfirst/views.py

from django.shortcuts import render_to_response 

from myfirst.forms import MyForm 

def testing(request): 
    if request.method == 'POST': 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      result = "valid" 
     else: 
      result = "not valid" 
    else: 
     form = MyForm() 
     result = "no post" 

    return render_to_response('test.html', {'form':form, 'result':result,}) 

/myfirst/forms.py 從Django的進口形式

class MyForm(forms.Form): 
    extra_cheeze = forms.BooleanField(required=False,initial=False,label='Extra cheeze') 

/myfirst/templates/test.html

<html> 
<head> 
</head> 
<body> 
    <form action="." method="POST"> 
     {{ form }} 
     <input type="submit" value="test"> 
    </form> 
    {{ result }} 
</body> 
</html> 

/urls.py 從django.conf.urls.defaults導入*

from myfirst.views import testing 

urlpatterns = patterns('', 
    (r'.*', testing), 
) 

然後只需運行該項目$蟒蛇manage.py runserver命令並瀏覽到http://localhost:8000/。實際上,您會發現所需內容對複選框不起作用,因爲您不能將其留空 - 「空白」答案實際上是「否」。如果你想確保用戶選擇一個答案有多個選擇,用戶必須選擇是或否。你可以強迫他們用單選按鈕回答。

+0

實際上,'required'的默認值爲True,請參閱http://docs.djangoproject.com/en/dev/ref/forms/fields/#required。 但是你的回答讓我發現了我的錯誤,所以+1!我會回答我自己的問題,以便向未來的讀者說明問題所在...... – Niklas 2009-10-13 10:00:26

+0

我從來沒有說過所需的默認值爲True或False :)我只是說它不會因爲它不可能離開選中或未選中複選框「空白」。所以,總有一種價值 - 需要或不會有所作爲。 – 2009-10-13 16:41:01

相關問題