【问题标题】:DJango form with custom __init__ not validating带有自定义 __init__ 的 DJango 表单未验证
【发布时间】:2015-08-20 22:37:39
【问题描述】:

当我使用此代码自定义表单的小部件时,它不会验证。如果我注释掉 def __init__(..) 它工作正常。

class CommentForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.wysiwyg = kwargs.pop('wysiwyg', False)

        super(CommentForm, self).__init__()
        if self.wysiwyg:
            self.fields['comment_text'].widget = SummernoteWidget()
        else:
            self.fields['comment_text'].widget = forms.Textarea(attrs={'rows':2})

    comment_text = forms.CharField()

到目前为止,我已经能够解决问题,工作表单(没有 init)和无效表单之间的区别是:

init 的表单无效:

CommentForm bound=False, valid=Unknown, fields=(comment_text)

有效形式:

CommentForm bound=True, valid=Unknown, fields=(comment_text)

问题是否存在,我该如何解决?

谢谢!

【问题讨论】:

  • 一个小提示-您没有将 args 和 kwargs 发送到 super
  • 这不是次要的,而是主要的。当您没有将 args 和 kwargs 从 super 传递到 init 时,表单将不会接收 POST 数据。

标签: django forms


【解决方案1】:

试试这个..可能有用

class CommentForm(forms.Form):
def __init__(self, *args, **kwargs):
    try:
        self.wysiwyg = kwargs['wysiwyg']
    except KeyError:
        self.wysiwyg = None

    super(CommentForm, self).__init__(*args, **kwargs)
    if self.wysiwyg:
        self.fields['comment_text'].widget = SummernoteWidget()
    else:
        self.fields['comment_text'].widget = forms.Textarea(attrs={'rows':2})

comment_text = forms.CharField()

【讨论】:

  • 尝试您的代码,我收到此错误:__init__() got an unexpected keyword argument 'wysiwyg' 这是开始创建表单的方式:comment_form = CommentForm(request.POST or None, wysiwyg=True)
  • 使用您的代码,如果我弹出关键字:self.wysiwyg = kwargs.pop('wysiwyg', False) 我没有收到任何错误。我认为这行得通!
猜你喜欢
  • 2021-06-22
  • 2012-10-05
  • 2015-01-13
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多