Форма Django только с BooleanField - PullRequest
       12

Форма Django только с BooleanField

10 голосов
/ 12 октября 2009

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

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 из поля. Насколько я могу понять из документов , это должно работать. Это работает, если я добавлю CharField в мою форму ...

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

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

Ответы [ 2 ]

9 голосов
/ 13 октября 2009

В моем вопросе была ошибка в коде. Спасибо @ 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 голосов
/ 12 октября 2009

Это также работает для меня на 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 из форм импорта django

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

/ myfirst / шаблоны / 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 import *

from myfirst.views import testing

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

Затем просто запустите проект $ python manage.py runserver и перейдите к http://localhost:8000/. На самом деле вы обнаружите, что требуемый ничего не делает с флажком, поскольку вы не можете оставить его пустым - a ' Пустой «ответ - фактически« нет ». Если вы хотите убедиться, что пользователь выбирает ответ, у вас есть несколько вариантов выбора, когда пользователь должен выбрать «да» или «нет». Вы также можете заставить их отвечать с помощью переключателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...