2009-10-12 15 views
8

Jestem raczej nowy dla Django i używam Django 1.0. mam to:
forms.py:Formularz Django z tylko 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... 

Problemem jest to, że forma nie jest ważna, chyba że jest zaznaczone pole wyboru, więc nie wydaje być sposobem na zdobycie fałszywej wartości z pola. O ile mogę zrozumieć z the docs, powinien działać. Działa, jeśli dodaję CharField do mojego formularza ...

Czy coś tu nie rozumiem, czy jest to błąd? (Tak, mam google ale nic nie znalazłem odpowiedniego)

Aktualizacja: Jak sugeruje @Dominic Rodger, próbowałem dodanie pola ukrytego
dummy = forms.CharField(initial='dummy', widget=forms.widgets.HiddenInput())
i sprawia, że ​​postać ważna. To obejście pozwala mi teraz przejść, ale nadal byłoby interesujące wiedzieć, czy coś nie rozumiem ...

+0

Huh. Brzmi jak błąd. Czy możesz obejść to za pomocą ukrytego pola? –

+0

Było kilka zgłoszeń błędów, które brzmią trochę podobnie - zobacz http://www.google.co.uk/search?q=django+checkbox+forms+poprzez –

+0

Spróbuję. Podejrzewam, że formularz nie lubi pustych danych, ponieważ przeglądarka nie będzie zawierała pola wyboru niezaznaczonego. – Niklas

Odpowiedz

8

Wystąpił błąd w kodzie w moim pytaniu. Dzięki @ d0ugal za pomoc mi znaleźć go, dodając nieco inny przykład.Problem był tutaj:

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

Błąd polegał na tym, że przyjąłem tę prośbę.POST wyceniłoby wartość True, jeśli byłby to post. Ale ponieważ przeglądarki nie publikują niczego dla niezaznaczonego pola wyboru, a było to jedyne pole, dane POST były pustym słownikiem, które ocenia się jako Fałsz. Powoduje to, że Brak będzie używany jako dane inicjujące, co spowoduje, że formularz będzie niezwiązany i nieważny.
Przykład @ d0ugal robi najpierw bezpieczną rzecz i test request.method.

4

To również działa dla mnie na 1.1, 1.0.3 i 1.0 (mam te trzy wirtualne konfiguracja środowiska). Testowałem to tylko w FireFox, więc jeśli jest to problem z przeglądarką to inna kwestia, ale o ile mi wiadomo, wszystkie obsługują dane POST z tym samym checkboxem.

Oto pełny kod projektu, który można odtworzyć w wolnym czasie i porównać z Twoim, aby zobaczyć różnicę.

Konfigurowanie w Ubuntu

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

Następnie w folderze app 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 z django formy import

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 z django.conf.urls.defaults import *

from myfirst.views import testing 

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

Następnie wystarczy uruchomić projekt $ python manage.py runserver i przejdź do http://localhost:8000/. Naprawdę okaże się, że wymagane nic nie robi z tym polem wyboru, ponieważ nie możesz zostawić go pustego - "pusta" odpowiedź jest skutecznie "nie". Jeśli chcesz mieć pewność, że użytkownik wybierze odpowiedź, możesz wybrać opcję, w której użytkownik musi wybrać odpowiedź "tak" lub "nie". Możesz zmusić ich do odpowiedzi również za pomocą przycisków radiowych.

+0

W rzeczywistości domyślną wartością "required" jest True, patrz http://docs.djangoproject.com/en/dev/ref/forms/fields/#required. Ale twoja odpowiedź pozwoliła mi dostrzec mój błąd, więc daj +1! Odpowiem na moje własne pytanie, aby wyjaśnić przyszłym czytelnikom, na czym polega problem ... – Niklas

+0

Nigdy nie powiedziałem, że domyślnie wymagane jest Prawda czy Fałsz :) Po prostu powiedziałem, że nie robi się inaczej, ponieważ nie można go opuścić pole wyboru "puste" jest zaznaczone lub nie wybrane. Zawsze jest więc pewna wartość - wymagana lub nie ma znaczenia. –

Powiązane problemy