2011-11-30 91 views
8

我有這樣的形式:隱藏字段不cleaned_data

class CollaboratorForm(forms.Form): 
    user = forms.CharField(label="Username",max_length=100) 
    canvas = forms.IntegerField(widget=forms.HiddenInput) 
    .... 
    def clean_user(self): 
     user = self.cleaned_data['user'] 
     canvas = self.cleaned_data['canvas'] 

在視圖中,我簡單地調用

if form.is_valid(): 

我得到的錯誤:

KeyError at /canvas/1/add-collaborator/ 
'canvas' 

根據螢火蟲的價值是張貼,這似乎並沒有讓我的清潔功能。我做錯了嗎?

編輯:郵政數據

canvas 1 
csrfmiddlewaretoken 2cb73be791b32ca9a41566082c804312 
user username 

EDIT2:我也很願意接受的答案,可以告訴我如何將主鍵發送到clean_user功能,其中主鍵是/ 1 /在上面的示例url中。視圖中的函數被調用是:

def canvas_add_collaborator(request, pk): 

所以我會想的PK發送到這將通過不需要隱藏字段解決我的問題的clean_user功能。

+0

你可以添加你的http文章的內容嗎?關於EDIT2的 –

+0

。您可以將pk傳遞給clean_user函數。 'clean_user(self,pk)' –

回答

9

您需要將方法名稱更改爲clean(),而不是clean_user()。如果您只是驗證用戶字段,那麼'canvas'不在clean_data中。

class CollaboratorForm(forms.Form): 
    .... 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('canvas', None) 
     super(CollaboratorForm, self).__init__(*args, **kwargs) 

然後在我的觀點:

def canvas_add_collaborator(request, pk): 
    .... 
    form.canvas = pk 

也許不是最完美的解決方案,但它的工作原理採用這種

+0

我不知道如何沒有點擊,這是非常有道理的。謝謝。 – Samsquanch

+0

是否有可能使用clean()方法? – Erwan

0

我解決我的問題(可能不是最好的辦法,但工程)目前。反饋歡迎。

+1

看看我的答案。你需要重新命名你的乾淨的功能。 –

0

我發現字段聲明中的順序很重要,所以如果您想要在clean_user方法中訪問cleared_data ['canvas'],則必須首先在字段中聲明畫布。我已經在模型表格中測試了這個