我是Python和django的新手。我目前遇到一个我无法克服的问题。我已经尝试阅读所有的文档和谷歌搜索,但到目前为止没有。
我有一个非常自定义的登录表单我需要使用。所有代码到目前为止都有作品。我只是想验证用户(工作正常),但如果他们输入不正确的详细信息,我想在表单上显示错误消息,说明无效的登录详细信息而不是返回HttpResponse,但我似乎无法弄清楚在像这样的脆弱形式上显示这样的auth错误。
非常感谢任何帮助
哦,是的,这是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 %}
由于
答案 0 :(得分:2)
使用消息系统
from django.contrib import messages
...
else:
messages.error(request, "Your error message")
loginForm = UserLoginForm()
....
检查django.contrib.messagges doc。
答案 1 :(得分:0)
您可能还想检查并查看是否已将HTML5 required
属性添加到您已在models.py
中定义的元素的表单元素标记。
如果您是,并且表单中缺少必需的元素,浏览器中的HTML5客户端验证会阻止表单提交,因此您无法获得request.POST
,因此没有Django服务器 - 边验证,因此不返回form.errors
。
我花了好几天困惑这个。无论如何,从Django 1.10开始,您可以在表单元素*中turn off the HTML5 required
attribute并依赖于服务器端Django验证(和模板错误消息)。
*在我的测试中,HTML5表单验证气泡支持被点击/未命中,我有锁定机器中的用户可能没有最新,最好的浏览器版本。