Сообщения для пользователей с флагом (user.is_active = False) во время входа в систему - PullRequest
0 голосов
/ 10 апреля 2019

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

Я использую контроллер LoginView,который использует встроенную стандартную форму с именем AuthenticationForm

AuthenticationForm имеет следующий метод:


def confirm_login_allowed(self, user):
    """
    Controls whether the given User may log in. This is a policy setting,
    independent of end-user authentication. This default behavior is to
    allow login by active users, and reject login by inactive users.

    If the given user cannot log in, this method should raise a
    ``forms.ValidationError``.

    If the given user may log in, this method should return None.
    """
    if not user.is_active:
        raise forms.ValidationError(
            self.error_messages['inactive'],
            code='inactive',

# and list of error messages within this class

error_messages = {
    'invalid_login': _(
        "Please enter a correct %(username)s and password. Note that both "
        "fields may be case-sensitive."
    ),
    'inactive': _("This account is inactive."),
}

Так что технически, если не user.is_active - он должен показывать сообщение «неактивно», но в моем случаедля инактивированных пользователей с таблицей is_active = False DB вместо этого выводится сообщение «invalid_login».Я пытаюсь на 100% правильно ввести логин и пароль, и пользователь не активен, но он показывает мне сообщение «invalid_login».Затем я просто включаю флаг is_active в БД в True, и это позволяет мне легко войти.У вас есть идея, почему это может быть?

Конечная цель - показать это сообщение «'неактивен": _ ("Эта учетная запись неактивна.") Пользователю, у которого есть учетная запись, но деактивированная.(или пользовательское сообщение) Технически это должно работать, но это не так.Заранее спасибо и извините, если вы нашли этот вопрос элементарным или немым.

Попытка:


class AuthCustomForm(AuthenticationForm):
    def clean(self):
        AuthenticationForm.clean(self)
        user = ExtraUser.objects.get(username=self.cleaned_data.get('username'))
        if not user.is_active and user:
            messages.warning(self.request, 'Please Activate your account',
                             extra_tags="", fail_silently=True)
           # return HttpResponseRedirect(' your url'))

И наконец, что помогло:


class AuthCustomForm(AuthenticationForm):

    def get_invalid_login_error(self):

        user = ExtraUser.objects.get(username=self.cleaned_data.get('username'))

        if not user.is_active and user:
            raise forms.ValidationError(
                self.error_messages['inactive'],
                code='inactive',)
        else:
            return forms.ValidationError(
                self.error_messages['invalid_login'],
                code='invalid_login',
                params={'username': self.username_field.verbose_name},
            )

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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019


class AuthCustomForm(AuthenticationForm):

    def get_invalid_login_error(self):

        user = ExtraUser.objects.get(username=self.cleaned_data.get('username'))

        if not user.is_active and user:
            raise forms.ValidationError(
                self.error_messages['inactive'],
                code='inactive',)
        else:
            return forms.ValidationError(
                self.error_messages['invalid_login'],
                code='invalid_login',
                params={'username': self.username_field.verbose_name}, )
0 голосов
/ 10 апреля 2019

Вы можете попробовать это.

user = authenticate(username=username, password=password)
if user and user.is_active==False:
   messages.warning(request, 'Please Activate your account', extra_tags="")
   return HttpResponseRedirect(' your url'))
...