【问题标题】:Hidden field in Django form not in cleaned_dataDjango表单中的隐藏字段不在cleaned_data中
【发布时间】:2011-11-30 15:49:26
【问题描述】:

我有这个表格:

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 函数的答案,其中主键是上面示例 url 中的 /1/。视图中被调用的函数是:

def canvas_add_collaborator(request, pk):

所以我想将 pk 发送到 clean_user 函数,这将通过不需要隐藏字段来解决我的问题。

【问题讨论】:

  • 你可以添加你的http帖子的内容吗?
  • 关于 EDIT2。您可以将 pk 传递给 clean_user 函数。 'clean_user(self, pk)'

标签: python django django-forms django-views


【解决方案1】:

您需要将方法名称更改为 clean(),而不是 clean_user()。如果您只是验证用户字段,则“canvas”不在cleaned_data 中。

【讨论】:

    【解决方案2】:

    我用这个解决了我的问题(可能不是最好的方法,但有效):

    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
    

    也许不是最优雅的解决方案,但它现在有效。欢迎反馈。

    【讨论】:

    • 看我的回答。您需要重命名您的 clean 函数。
    【解决方案3】:

    我发现声明字段的顺序很重要,所以如果你想在 clean_user 方法中访问cleaned_data['canvas'],你必须先在你的字段中声明canvas。我已经在模型表单中对此进行了测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-17
      • 2023-03-26
      • 2010-10-11
      • 2023-04-08
      • 1970-01-01
      • 2010-09-30
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多