Django表单中的隐藏字段不在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'
根据firebug的显示,数据是发送出去的,但似乎没有到达我的清理函数。我是不是做错了什么?
编辑:发送的数据
canvas 1
csrfmiddlewaretoken 2cb73be791b32ca9a41566082c804312
user username
编辑2:我也想知道怎么把主键发送到clean_user函数中,主键就是上面示例网址中的/1/。在视图中调用的函数是:
def canvas_add_collaborator(request, pk):
所以我想把主键发送到clean_user函数,这样就能解决我不需要隐藏字段的问题。
3 个回答
0
我发现字段的声明顺序很重要。如果你想在 clean_user 方法中访问 cleaned_data['canvas'],那么你必须先在字段中声明 canvas。我在模型表单中测试过这个。
0
我解决了我的问题(可能不是最好的方法,但能用)用的是这个:
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
这可能不是最优雅的解决方案,但现在能用就行。欢迎反馈。
11
你需要把方法的名字改成 clean(),而不是 clean_user()。如果你只是验证用户字段的话,'canvas' 是不会出现在 cleaned_data 里的。