2012-03-13 58 views
5

根據Django教程,您應該使用cleaned_data字典訪問表單字段。我想知道爲什麼我無法直接訪問表單的屬性?我的表單驗證很好,但是當我嘗試訪問它時,Django抱怨對象沒有該屬性。我在下面添加了一些代碼,希望能幫助診斷問題。在django視圖中訪問表單字段作爲屬性

形式:

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

查看:

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 

我得到以下錯誤: 'CustomForm' 對象有沒有屬性 '的描述'。我在文檔中錯過了一些說我無法做到的事情嗎?

回答

10

定義使用領域django.forms僅僅是一個方便的方式,去說話的語法;它並不真正代表最終的Form類或它的一個實例在屬性方面的樣子。

形式具有metaclass(沒有得到過深​​進去,元類是使用class關鍵字作爲__init__方法是使用括號創建該類的一個實例聲明類 - 一個鉤來定製對象是創建,在元類的情況下,它是一個class!),它在定義時間從表單類中選擇Fields並將它們添加到base_fields字典中。當您實例化一個表單時,其base_fields被深度複製到該實例的fields屬性。混亂的

的一點可能是,你用.訪問字段顯示模板 - 什麼實際發生的事情是,Django的模板引擎首先嚐試使用字典式[]訪問,從而解決財產查找和基本形式類定義了一個__getitem__方法來利用這一點,從表單實例的fields字典中查找適當的字段並用BoundField封裝它,該封裝器知道如何使用字段和表單中的數據來顯示字段。

15

如果您的形式進行驗證,那麼你可以訪問myForm的 cleaned_data:

print myForm.cleaned_data.get('description') 

如果你想知道爲什麼你不能訪問myForm.description然後就可以看到你的myForm的數據字典

print myForm.__dict__ 
+0

我知道我可以使用cleaned_data訪問它。我不明白的是爲什麼我無法使用屬性本身訪問它:myForm.description。在引擎蓋下究竟發生了什麼,阻止我訪問它? – 2012-03-13 16:20:18

3

您可以訪問您的字段trought 字典

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