2012-03-13 16 views
5

Zgodnie z samouczkiem Django, powinieneś uzyskać dostęp do pól formularza za pomocą clean_data dictionary. Zastanawiam się, dlaczego nie mam bezpośredniego dostępu do właściwości formularza? Moja forma sprawdza się poprawnie, ale kiedy próbuję uzyskać do niej dostęp, Django skarży się, że obiekt nie ma atrybutu. Dodałem kod poniżej, mam nadzieję, że pomoże zdiagnozować problem.Uzyskiwanie dostępu do pól formularza jako właściwości w widoku django

Postać:

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

Widok:

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 

pojawia się następujący błąd: obiekt '' Customform nie ma atrybutu 'opis'. Czy tęskniłem za czymś w dokumentach, które mówią, że nie mogę tego zrobić?

Odpowiedz

10

sposób definiowania pól przy użyciu django.forms jest po prostu wygodne, de klarowna składnia; nie jest tak naprawdę reprezentatywne dla tego, jak wygląda ostateczna klasa Form lub jej przykład pod względem atrybutów.

Formularze mają metaclass (bez zbytniego głąb niego, metaklasa jest zadeklarowanie klasy za pomocą słowa kluczowego class jako metoda __init__ jest utworzenie instancji klasy przy użyciu nawiasów - hak dostosować obiekt będący utworzony, który w przypadku metaklasy jest class!), który odbiera pola z klasy formularza w czasie definicji i dodaje je do dyktatury base_fields. Podczas tworzenia instancji jego numer base_fields jest głęboko kopiowany do atrybutu fields instancji.

Jednym z powodów zamieszania może być to, że używasz . do uzyskiwania dostępu do pól do wyświetlania w szablonach - co faktycznie się dzieje, to silnik szablonu Django najpierw próbuje użyć stylu słownikowego [] dostęp w celu rozwiązania wyszukiwania właściwości i podstawowej klasy formularza definiuje metodę __getitem__, aby skorzystać z tej możliwości, wyszukując odpowiednie pole z dyktafonu formularza formularza: fields i opakowując je za pomocą opakowania BoundField, które wie, jak używać pola i danych z formularza do wyświetlania tego pola.

15

Jeśli formularz jest weryfikowany następnie można uzyskać dostęp MyForm cleaned_data:

print myForm.cleaned_data.get('description') 

Jeśli chcesz zobaczyć, dlaczego nie można uzyskać dostępu myForm.description następnie można zobaczyć słownika danych swojego MyForm:

print myForm.__dict__ 
+0

Rozumiem, że można do niego dostęp za pomocą cleaned_data. Czego nie rozumiem, to dlaczego nie mogę uzyskać do niego dostępu za pomocą samej właściwości: myForm.description. Co dokładnie dzieje się pod maską, która uniemożliwia mi dostęp do niego? –

3

Możesz uzyskać dostęp do swojej trought field dict.

form.__dict__["fields"]["description"] 
Powiązane problemy