使用自定义 AuthenticationForm 覆盖 Django LoginView 错误消息

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)

如果用户的电子邮件尚未激活,我想覆盖错误消息,因为他们必须单击发送到其电子邮件地址的链接。当前的默认消息如下所示:

覆盖LoginView错误消息

而不是说:

请输入正确的电子邮件地址和密码。两个地方都要注意大小写。

我想说一句话,大意是:

请确认您的电子邮件,以便您可以登录。

我试过:

账户/表单.py

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)

账户/views.py

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)

当我尝试使用确实存在但尚未验证其电子邮件地址的用户登录时,结果绝对没有效果。

身份验证表单文档。

JPG*_*JPG 5

方法 - 1

\n

Django 使用ModelBackend默认值AUTHENTICATION_BACKENDS,并且不对非活动用户进行身份验证。

\n

这也在非活动用户授权部分中进行了说明,

\n
\n

is_active非活动用户是指其字段设置为 的用户False。身份验证ModelBackend后端RemoteUserBackend禁止这些用户进行身份验证。如果自定义用户模型没有\xe2\x80\x99\nanis_active字段,则将允许所有用户进行身份验证。

\n
\n

因此,设置AllowAllUsersModelBackend为您AUTHENTICATION_BACKENDS的settings.py

\n
# settings.py\n\nAUTHENTICATION_BACKENDS = [\'django.contrib.auth.backends.AllowAllUsersModelBackend\']\n
Run Code Online (Sandbox Code Playgroud)\n
\n

它对我的 Django 应用程序有多大影响?

\n

除了身份验证之外,它不会影响任何其他内容。如果我们查看类的源代码,AllowAllUsersModelBackend我们可以看到它只允许非活动用户进行身份验证。

\n
\n

方法 - 2

\n

就我个人而言,我不推荐这种方法,因为method-1是 Django 解决这个问题的方法。

\n

重写类clean(...)的方法PickyAuthenticationForm并调用AllowAllUsersModelBackend后端,

\n
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