2009-10-12 15 views
8

Django için oldukça yeniyim ve Django 1.0 kullanıyorum. Ben bu:
forms.py:Sadece bir BooleanField ile Django formu

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

sorun formu onay kutusu işaretli sürece geçerli değil, bu yüzden orada görünmüyor olmasıdır alandan yanlış bir değer elde etmenin bir yolu. the docs'dan anlayabildiğim kadarıyla çalışmalı. Formuma bir CharField eklersem çalışır ...

Burada bir şeyi yanlış anladım mı yoksa bu bir hata mı?

Güncelleme (Evet, googled ancak ilgili hiçbir şey bulduk): @Dominic Rodger önerdiği gibi, ben gizli bir sahadan
dummy = forms.CharField(initial='dummy', widget=forms.widgets.HiddenInput())
ekleyerek çalıştı ve bu form geçerli kılar. Bu geçici çözüm, şu an üzerinde hareket etmemi sağlıyor, ancak bir şeyleri yanlış anladığımı bilmek ilginç olurdu ...

+0

Huh. Bana bir böcek gibi geldi. Gizli bir alan kullanarak geçici çözüm olabilir misiniz? –

+0

Kulağa benzer benzer ses raporları geldi - bkz. Http://www.google.com.tr/search?q=django+checkbox+forms+bug –

+0

Denerim. Tarayıcı boş bir onay kutusunu işaretlemediğinden, formun boş verileri sevmediğinden şüpheleniyorum. – Niklas

cevap

8

Soruda kodda bir hata oluştu. Biraz farklı bir örnek ekleyerek bana yardımcı olmak için @ d0ugal sayesinde.Burada sorun vardı:

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

böcek Ben bir post olsaydı request.POST True olarak değerlendirmek farz oldu. Ancak, tarayıcılar işaretli olmayan bir onay kutusu için hiçbir şey göndermediğinden ve bu tek alan olduğundan, POST verileri False değerini değerlendiren boş bir sözlüktür. Bu, hiçbirinin, başlatma verisi olarak kullanılmasına ve formun ilişkisiz olmasına ve geçerli olmamasına neden olmuştur.
@ d0ugal'ın örneği, önce güvenli bir şey ve test talebi yapar.

4

Bu, 1.1, 1.0.3 ve 1.0 sürümlerinde benim için de çalışır ortam ayarları). Bunu sadece FireFox'ta test ettim, eğer bir tarayıcı sorunu başka bir konuya benziyorsa, ama bildiğim kadarıyla hepsi POST verilerini onay kutularıyla aynı şekilde ele alıyorlar.

İşte bu projenin tam kodudur, böylece boş zamanlarınızda çoğaltabilirsiniz ve farkı görmek için sizinkilerle kıyaslayabilirsiniz. myfirst uygulama klasöründe Sonra

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

Ubuntu

yılında kurulması

; Django içe formları

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

/myfirst/templates/test.html

den

/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

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

/urls.py *

from myfirst.views import testing 

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

Sonra sadece proje $ python manage.py runserver çalıştırın ve http://localhost:8000/ göz içe. Aslında gerekli olanın onay kutusuyla hiçbir şey yapamayacağını anlayacaksınız çünkü boş bırakılamaz - 'boş' yanıt etkilidir 'hayır'. Bir kullanıcının bir cevap seçtiğinden emin olmak istiyorsanız, kullanıcının evet ya da hayır seçmesi gereken çoktan seçmeli bir seçeneği vardır. Onları radyo düğmeleriyle cevaplamaya zorlayabilirsin.

+0

Aslında, 'gerekli' varsayılanı Doğru, bkz. Http://docs.djangoproject.com/en/dev/ref/forms/fields/#required. Ama cevabınız beni hatalandırdı, bu yüzden bunun için +1! Gelecek okuyucular için sorunun ne olduğunu açıklığa kavuşturmak için kendi sorumu cevaplayacağım ... – Niklas

+0

Gerektiği varsayılanın doğru ya da yanlış olduğunu söylemedim :) Sadece ayrılmak imkansız olduğundan farklı bir şey yapmadığını söyledim bir onay kutusu boş veya seçili veya seçili değil. Yani, her zaman bir değer vardır - gerekli veya değişmeyecek bir şey. –