【问题标题】:Django crispy forms error messageDjango 脆皮表单错误信息
【发布时间】:2015-01-07 13:50:06
【问题描述】:

我对 Python 和 django 非常陌生。我目前有一个我无法克服的问题。我已经尝试阅读所有文档和谷歌搜索,但目前还没有。

我需要使用一个非常自定义的登录表单。到目前为止,所有的代码都是有效的。我只想对用户进行身份验证(效果很好),但是如果他们输入了不正确的详细信息,我想在表单上显示一条错误消息,说明登录详细信息无效,而不是返回 HttpResponse,但我似乎无法弄清楚究竟如何在这样的清晰表单上显示这样的身份验证错误。

任何帮助将不胜感激

哦,是的,如果这有什么不同的话,这是 python 3.4

这是我的forms.py:

class UserLoginForm(forms.ModelForm):
    email = forms.CharField(
        label="Your email address",
        max_length=80,
        required=True,
    )

    password = forms.CharField(
        label="Your password",
        required=True,
    )

    def __init__(self, *args, **kwargs):
        super(UserLoginForm, self).__init__(*args,**kwargs)

        self.helper = FormHelper(self)
        self.helper.form_id = 'form-login'
        self.helper.form_class = 'form-login'
        self.helper.form_method = 'POST'
        self.helper.form_action = 'login'
        self.helper.field_class = 'form-control input-lg'
        self.helper.form_show_errors = True
        self.helper.layout = Layout(
            Field('email', template='crispy/login_input_email.html'),
            Field('password', template='crispy/login_input_password.html'),
        )

        self.helper.layout.append(Submit('login', 'Log me in', css_class='btn btn-primary btn-lg'))

    class Meta:
        model = User
        fields = ('email', 'password',)

这是我的views.py:

def login_view(request, template_name='login.html'):

    redirect_url = request.GET.get('next')

    if request.method=='POST':
        loginForm = UserLoginForm(request.POST)
        if loginForm.is_valid():

            username = loginForm.cleaned_data.get('email')
            password = loginForm.cleaned_data.get('password')

            user = authenticate(username=username, password=password)
            if user is not None:
                if redirect_url is None:
                    redirect_url='/home'

                login(request, user)
                return HttpResponseRedirect(redirect_url)
            return HttpResponse("Invalid login details supplied.")
        return render_to_response(template_name, {'crispy_form': loginForm}, context_instance=RequestContext(request))
    else:
        loginForm = UserLoginForm()
    return render_to_response(template_name, {'crispy_form': loginForm}, context_instance=RequestContext(request))

最后,这是我的模板:

{% extends "master.html" %}

{% load crispy_forms_tags %}

{% block content %}
   <div class="inner-block">
        <h1>Log in to your account</h1>
        {% crispy crispy_form crispy_form.helper %}
  </div>
{% endblock %}

谢谢

【问题讨论】:

    标签: python django django-crispy-forms


    【解决方案1】:

    使用消息系统

    from django.contrib import messages
    
    ...
    else:
        messages.error(request, "Your error message")
        loginForm = UserLoginForm()
    ....
    

    查看 django.contrib.messagges 文档。

    【讨论】:

    • 太棒了。这是最终为我工作的解决方案。谢谢
    【解决方案2】:

    您可能还想检查一下是否将 HTML5 required 属性添加到您在 models.py 中定义的元素的表单元素标签中。

    如果是这样,并且表单中缺少必需的元素,则浏览器中的 HTML5 客户端验证会阻止表单提交,因此您不会得到 request.POST,因此没有 Django 服务器端验证,因此没有form.errors 被返回。

    我花了好几天才弄明白这个。无论如何,从 Django 1.10 开始,您可以在表单元素* 中 turn off the HTML5 required attribute 并依赖服务器端 Django 验证(和模板错误消息)。

    *在我的测试中,HTML5 表单验证气泡支持被击中/未命中,我的用户处于锁定的机器中,他们可能没有最新、最好的浏览器版本。

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2014-02-28
      • 2017-03-19
      • 2019-07-27
      • 2014-12-17
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 2015-02-15
      相关资源
      最近更新 更多