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

Если Вы рады использовать Java, проверьте JFugue.

12
задан Niklas 12 October 2009 в 12:21
поделиться

2 ответа

There was a bug in the code in my question. Thanks to @d0ugal for helping me spot it by including a slightly different example. The problem was here:

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

The bug was that I assumed that request.POST would evaluate to True if it was a post. But since browsers don't post anything for a not-checked checkbox, and that was the only field, the POST data was an empty dictionary, which evaluates to False. This caused None to be used as initialization data, causing the form to be unbound and not valid.
@d0ugal's example does the safe thing and tests request.method first.

10
ответ дан 2 December 2019 в 21:03
поделиться

Это также работает для меня в версиях 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/templates/test.html

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

/urls.py from django.conf.urls.defaults import *

from myfirst.views import testing

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

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

4
ответ дан 2 December 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: