2011-11-30 92 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'],则必须首先在字段中声明画布。我已经在模型表格中测试了这个