2009-10-12 4 views
8

Я довольно новичок в Django, и я использую Django 1.0. у меня есть это:
forms.py:Django form только с BooleanField

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

Проблема заключается в том, что форма не является действительным, если флажок не установлен, поэтому не кажется для того, чтобы получить значение False из поля. Насколько я понимаю из the docs, он должен работать. Он работает, если я добавлю CharField к моей форме ...

Я что-то не понимаю или это ошибка? (Да, я гугл, но ничего не нашел соответствующее)

Update: Как было предложено @Dominic Роджера, я попытался добавить скрытое поле
dummy = forms.CharField(initial='dummy', widget=forms.widgets.HiddenInput())
и что делает форму действительной. Это обходное решение позволяет мне двигаться прямо сейчас, но было бы интересно узнать, не ошибаюсь ли я что-то ...

+0

Huh. Звучит как ошибка. Не могли бы вы его использовать с помощью скрытого поля? –

+0

Было несколько отчетов об ошибках, которые кажутся похожими - см. Http://www.google.co.uk/search?q=django+checkbox+forms+bug –

+0

Я попробую. Я подозреваю, что Форме не нравятся пустые данные, так как браузер не будет включать поле для снятого флажка. – Niklas

ответ

8

В моем вопросе была ошибка в коде. Спасибо @ d0ugal за то, что помогли мне определить это, включив немного другой пример.Проблема была здесь:

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

Ошибка была в том, что я предположил, что request.POST будет оценивать значение True, если это сообщение. Но поскольку браузеры ничего не публикуют для флажка not-checked, и это было единственное поле, данные 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 папке приложения;

/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 от Джанго импортных форм

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

Фактически, значение по умолчанию для «требуется» равно True, см. Http://docs.djangoproject.com/en/dev/ref/forms/fields/#required. Но ваш ответ заставил меня заметить мою ошибку, так что +1 за это! Я отвечу на свой вопрос, чтобы дать понять будущим читателям, в чем проблема ... – Niklas

+0

Я никогда не говорил, что значение по умолчанию для него было истинным или ложным :) Я просто сказал, что это не так, поскольку его невозможно оставить флажок «пустой» его либо выбран, либо не выбран. Таким образом, всегда есть значение - требуется или не имеет значения. –

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