Django表单中的隐藏字段不在cleaned_data中

9 投票
3 回答
5018 浏览
提问于 2025-04-17 07:24

我有一个表单:

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 里的。

撰写回答