Переопределить Django Сообщение об ошибке LoginView с пользовательской формой AuthenticationForm - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть представление на основе классов, что подклассы 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,
    })

Я хочу переопределить сообщение об ошибке, если электронная почта пользователя еще не активна, потому что он должен щелкнуть ссылку, отправленную на его адрес. Адрес электронной почты. Текущее сообщение по умолчанию выглядит следующим образом:

override LoginView error message

Вместо слов:

Пожалуйста, введите правильный адрес электронной почты и пароль , Обратите внимание, что оба поля могут быть регистрозависимыми.

Я хочу сказать что-то о следующем:

Пожалуйста, подтвердите свой адрес электронной почты, чтобы вы могли войти.

Я пробовал:

accounts / forms.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',
            )

accounts / 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,
        })

Результат абсолютно не влияет когда я пытаюсь войти в систему с пользователем, который действительно существует, но еще не подтвердил его адрес электронной почты.

AuthenticationForm docs .

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я не уверен, что настройка пользовательского бэкэнда - это решение, когда я просто хочу переопределить сообщение. Я сделал временное исправление, определив form_invalid. Да, это хакерское дело, но пока, это поможет. Сомневаюсь, что это кому-нибудь поможет, но было интересно узнать form.errors. Может быть, кто-то может построить это, чтобы решить свою проблему c.

def form_invalid(self, form):
    """If the form is invalid, render the invalid form."""
    #TODO: This is EXTREMELY HACKY!
    if form.errors:
        email = form.cleaned_data.get('username')
        if User.objects.filter(email=email, username=None).exists():
            if len(form.errors['__all__']) == 1:
                form.errors['__all__'][0] = 'Please confirm your email to log in.'
    return self.render_to_response(self.get_context_data(form=form))
0 голосов
/ 30 апреля 2020

Вам необходимо использовать AllowAllUsersModelBackend

https://docs.djangoproject.com/en/3.0/ref/contrib/auth/#django .contrib.auth.backends.AllowAllUsersModelBackend

Здесь вы получите инструкцию по настройке пользовательского бэкэнда

https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#specifying -eauthentication-backends

Надеюсь, это поможет.

...