Jar*_*rad 4 forms django django-authentication loginview
我有一个基于类的视图,即子类LoginView.
from django.contrib.auth.views import LoginView
class CustomLoginView(LoginView):
def get_success_url(self):
url = self.get_redirect_url()
return url or reverse_lazy('knowledgebase:user_home', kwargs={
'username':self.request.user.username,
})
Run Code Online (Sandbox Code Playgroud)
如果用户的电子邮件尚未激活,我想覆盖错误消息,因为他们必须单击发送到其电子邮件地址的链接。当前的默认消息如下所示:
而不是说:
请输入正确的电子邮件地址和密码。两个地方都要注意大小写。
我想说一句话,大意是:
请确认您的电子邮件,以便您可以登录。
我试过:
from django.contrib.auth.forms import AuthenticationForm
from django.utils.translation import gettext as _
class PickyAuthenticationForm(AuthenticationForm):
def confirm_login_allowed(self, user):
if not user.is_active:
raise forms.ValidationError(
_("Please confirm your email so you can log in."),
code='inactive',
)
Run Code Online (Sandbox Code Playgroud)
class CustomLoginView(LoginView): # 1. <--- note: this is a class-based view
form_class = PickyAuthenticationForm # 2. <--- note: define form here?
def get_success_url(self):
url = self.get_redirect_url()
return url or reverse_lazy('knowledgebase:user_home', kwargs={
'username':self.request.user.username,
})
Run Code Online (Sandbox Code Playgroud)
当我尝试使用确实存在但尚未验证其电子邮件地址的用户登录时,结果绝对没有效果。
Django 使用ModelBackend默认值AUTHENTICATION_BACKENDS,并且不对非活动用户进行身份验证。
这也在非活动用户授权部分中进行了说明,
\n\n\n\n
is_active非活动用户是指其字段设置为 的用户False。身份验证ModelBackend后端RemoteUserBackend禁止这些用户进行身份验证。如果自定义用户模型没有\xe2\x80\x99\nanis_active字段,则将允许所有用户进行身份验证。
因此,设置AllowAllUsersModelBackend为您AUTHENTICATION_BACKENDS的settings.py
# settings.py\n\nAUTHENTICATION_BACKENDS = [\'django.contrib.auth.backends.AllowAllUsersModelBackend\']\nRun Code Online (Sandbox Code Playgroud)\n 除了身份验证之外,它不会影响任何其他内容。如果我们查看类的源代码,AllowAllUsersModelBackend我们可以看到它只允许非活动用户进行身份验证。
就我个人而言,我不推荐这种方法,因为method-1是 Django 解决这个问题的方法。
\n重写类clean(...)的方法PickyAuthenticationForm并调用AllowAllUsersModelBackend后端,
from django.contrib.auth.backends import AllowAllUsersModelBackend\n\n\nclass PickyAuthenticationForm(AuthenticationForm):\n def clean(self):\n username = self.cleaned_data.get(\'username\')\n password = self.cleaned_data.get(\'password\')\n\n if username is not None and password:\n backend = AllowAllUsersModelBackend()\n self.user_cache = backend.authenticate(self.request, username=username, password=password)\n if self.user_cache is None:\n raise self.get_invalid_login_error()\n else:\n self.confirm_login_allowed(self.user_cache)\n\n return self.cleaned_data\n\n def confirm_login_allowed(self, user):\n if not user.is_active:\n raise forms.ValidationError(\n "Please confirm your email so you can log in.",\n code=\'inactive\',\n )Run Code Online (Sandbox Code Playgroud)\n结果截图
\n\n