Django:提交表单时未显示错误

Posted

技术标签:

【中文标题】Django:提交表单时未显示错误【英文标题】:Django: errors not being shown when form is submitted 【发布时间】:2014-03-13 03:34:12 【问题描述】:

无论我的输入是什么,无论我在 clean 中尝试何种显示错误的方法,clean 都不会在我的登录表单上显示错误。

在我的 CustomUserCreationForm 错误显示中完美运行。两者的唯一区别是 login 扩展 forms.Form 而 Custom 扩展 UserCreationForm

我也在使用 django-crispy-forms 来呈现我的表单

class LoginForm(forms.Form):
    username = forms.CharField(label=('UserName'),
            widget = forms.TextInput(attrs='placeholder': _('Username'))
    )
    password = forms.CharField(label=('Password'),
            widget=forms.PasswordInput(attrs='placeholder' : _('Password') ),
    )

    def helper(self):
            helper = FormHelper()

            helper.form_id = "Login"
            helper.form_method = "POST"
            helper.layout = Layout(Div(
                    Field('username', css_class='input-box-rounded'),
                    Field('password', css_class='input-box-rounded'),
                    Submit('Login', 'Login',  css_class='col-md-6 col-md-offset-3 rounded'),
                     css_class='col-md-4 col-md-offset-4 centered-div'))
            return helper

    def clean(self):

            cleaned_data = super(LoginForm, self).clean()

            if 'username' not in cleaned_data:
                    msg = _("Please enter a username")
                    self._errors['username'] = self.error_class([msg])
            if 'password' not in cleaned_data:
                    msg = _("Please enter a password")
                    raise forms.ValidationError(msg)
            u =authenticate(username = cleaned_data['username'], password = cleaned_data['password'])
            if u == None:
                    msg = _("Username or Password is incorrect")
                    self.add_error('username', msg)

            return cleaned_data

【问题讨论】:

【参考方案1】:

你能发布你的视图和模板代码吗?没有看到其中任何一个,我假设您的模板需要显示错误,或者您的视图没有处理表单,尽管我没有使用 Django Crispy Forms。

 form.non_field_errors 
 form.username.errors 

仅供参考,处理错误检查的首选方法是为每个字段创建一个干净的函数,并在出现问题时引发 ValidationError。这将是一个字段错误(上面的第二行)。

def clean_password(self):
    data = self.cleaned_data.get('password')
    if not data:
        raise ValidationError(_("Please enter a password"))

此外,由于您只是检查一个字段是否存在,因此您可以为每个必填字段设置required=True 并跳过手动验证。

class LoginForm(forms.Form):
    username = forms.CharField(label=('UserName'), required=True,
        widget = forms.TextInput(attrs='placeholder': _('Username'))
    )
    password = forms.CharField(label=('Password'), required=True,
        widget=forms.PasswordInput(attrs='placeholder' : _('Password') ),
    )

有关更多信息,请参阅文档:https://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

【讨论】:

以上是关于Django:提交表单时未显示错误的主要内容,如果未能解决你的问题,请参考以下文章

表单输入的值在 React 中提交时未更新

显示键盘时未在移动设备中触发提交事件

单击提交时未调用Django视图功能

如果提交表单时未选中复选框,如何将布尔值更新为 0

html 博客:提交表单时未传递任何表单参数

Django 表单:提交表单时出现隐藏字段错误