我正在尝试创建自定义登录表单。以下是我到目前为止的情况。我的问题是,无论我做什么,登录都不会进行身份验证。即使我有正确的电子邮件和密码我总是得到:
请输入正确的用户名和密码。请注意,这两个字段可能区分大小写。
我认为这是因为我正在检查电子邮件和密码。
* 这是我的表单。 *
class EmailAuthenticationForm(AuthenticationForm):
username = forms.EmailField(label=_('Email Address'))
redirect_url = forms.CharField(
widget=forms.HiddenInput, required=False)
def __init__(self, host=None, *args, **kwargs):
self.host = host
super(EmailAuthenticationForm, self).__init__(*args, **kwargs)
这是我的观点。**
class AccountAuthView(FormView):
template_name = 'accounts/login.html'
form_class = EmailAuthenticationForm
redirect_field_name = 'next'
def get_form_class(self):
return self.form_class
def form_valid(self, form):
auth_login(self.request, form.get_user())
return HttpResponseRedirect(form.cleaned_data['redirect_url'])
def get(self, request, *args, **kwargs):
if request.user.is_authenticated():
return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
return super(AccountAuthView, self).get(
request, *args, **kwargs)
答案 0 :(得分:2)
是的,这可以很容易地完成,首先创建一个身份验证后端:
<强> backend.py 强>
from django.contrib.auth import get_user_model
class EmailAuthBackend(object):
"""
Email Authentication Backend
"""
def authenticate(self, username=None, password=None):
""" Authenticate a user based on email address as the user name. """
try:
user = get_user_model().objects.get(email=username)
if user.check_password(password):
return user
except get_user_model().DoesNotExist:
return None
然后在 settings.py:
中AUTHENTICATION_BACKENDS = ('backends.EmailAuthBackend',)
最后确保您的表单包含电子邮件字段:
<form action="." method="post">
{% csrf_token %}
<input type="hidden" name="next" value="{{ next }}" />
{{ form.non_field_errors }}
{% for field in form %}
<div class="field-wrapper">
<div class="label-wrapper">
{% if field.name == "username" %}
Email address
{% else %}
{{ field.label_tag }}
{% endif %}
{% if field.field.required %}<span class="required">*</span>{% endif %}
</div>
<div class="value-wrapper">
{{ field }}
{{ field.errors }}
</div>
</div>
{% endfor %}
<div class="submit-wrapper">
<input type="submit" value="Sign In" />
</div>
</form>
答案 1 :(得分:1)
Django有Full Example来展示如何进行自定义身份验证。