2012-03-13 27 views
5

Django eğiticisine göre, clear_data sözlüğünü kullanarak form alanlarına erişmelisiniz. Neden formun özelliklerine doğrudan erişemediğimi merak ediyorum? Formum doğru bir şekilde doğrulanıyor ancak erişmeye çalıştığımda Django, nesnenin bu özelliğe sahip olmadığından şikayet ediyor. Sorunun teşhis edilmesine yardımcı olacağını umduğum bir kod ekledim.Form alanlarına django görünümünde özellik olarak erişme

Form:

class CustomForm(forms.Form): 
    description = forms.CharField(widget = forms.TextInput(attrs = {'placeholder' : 'enter some text'}), label = "My form") 

Görünüm:

def process_form(request): 
    if request.method != 'POST': 
     raise Http404 

    myForm = CustomForm(request.POST) 

    if not myForm.is_valid(): 
     c = RequestContext(request) 
     return render_to_response('home/index.html', {'form' : myForm }, c) 

    # debug 
    print 'Description: ' + myForm.description # this does NOT work 
    # print 'Description: ' + myForm.cleaned_data['description'] # this does work 

aşağıdaki hatayı alıyorum: 'CustomForm' nesne hiçbir özelliği 'ni açıklama' vardır. Dokümanlarda bunu yapamayacağımı söyleyen bir şeyi özledim mi?

cevap

10

Eğer alanları django.forms sadece uygundur kullanarak tanımladığınız şekilde, de clarative sözdizimi; Son Form sınıfının veya bir örneğinin nitelikler açısından neye benzediğini gerçekten temsil etmiyor. bir kanca olmak nesneyi özelleştirmek için -

Formlar çok derin içine almadan bir metaclass (bir metaclass bir __init__ yöntem parantez kullanarak bir sınıfın örneğini oluşturmak için olduğu gibi class anahtar kelimeyi kullanarak bir sınıf ilan etmektir var Oluşturulan, bir metaclass durumunda, tanım zaman form sınıfından Alanlar'ı alan ve bunları bir base_fields dict için ekler bir class! Bir formu başlattığınızda, onun base_fields örneğinde bir fields özniteliğine derin kopyalanır. aslında ne oluyor Django'nın şablon motoru ilk özellik aramalarını ve baz form sınıfı çözmek için sözlük-stile [] erişim kullanmak için çaba gösterdiği yoktur - karışıklık

Bir noktada şablonları görüntülenmek için alanlar erişmek için . kullandığını olabilir bu avantajdan faydalanmak için __getitem__ yöntemini tanımlar, form örneğinin fields dict öğesinden uygun alanı arar ve alanı görüntülemek için formdan alan ve verileri nasıl kullanacağını bilen bir sarıcı olan BoundField ile sarılır.

15

Formunuz sonra Myform cleaned_data erişebilir valide ise: Eğer o zaman MyForm veri sözlüğü görebilirsiniz sen myForm.description erişemez neden görmek istiyorsanız

print myForm.cleaned_data.get('description') 

:

print myForm.__dict__ 
+0

olduğunu. Anlamadığım şey, mülkün kendisini kullanarak neden erişemiyorum: myForm.description. Kaputun altında, tam olarak bana ulaşmamı engelleyen nedir? –

3

dict alanınıza girebilirsiniz.

form.__dict__["fields"]["description"] 
3

Form örneğinin alanlarına alan özniteliğinden erişebilirsiniz.

myForm.fields['description'] 

Ve etiket gibi bazı özellik böyle erişilebilir:

myForm.fields['description'].label 

değeri karşılık gelen nasıl görüntüleneceğini Emin değilim. Bir fikri olan var mı?

burada ben cleaned_data kullanarak erişebilirsiniz anlıyoruz benim referans

https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-the-fields-from-the-form

İlgili konular