2016-10-12 7 views
1

В моем шаблоне, login.html, у меня есть:user.is_authenticated всегда возвращает значение False для неактивных пользователей на шаблоне

{% if form.errors %} 
    {% if user.is_authenticated %} 
    <div class="alert alert-warning"><center>Your account doesn't have access to this utility.</center></div> 
    {% else %} 
    <div class="alert alert-warning"><center>Incorrect username or password!</center></div> 
    {% endif %} 
{% endif %} 

То, что я пытаюсь сделать, если после отправки формы, пользователь неактивен, то показано другое сообщение об ошибке, и если пользователь просто не аутентифицирован, отобразите неверное сообщение об ошибке пароля пользователя. Это не работает. Он всегда отображает «Неверное имя пользователя или пароль!». в обоих случаях. Однако внутри представления user.is_authenticated возвращает True даже для неактивных пользователей.

Есть ли у меня какие-либо другие возможности сделать это? Я также попытался

{% if 'inactive' in form.errors %} 

Но это не работает слишком, хотя, когда я пытаюсь напечатать form.errors, он показывает текст «Этот аккаунт неактивен» для неактивных пользователей.

EDIT: Для зрения, я просто используя вид входа Джанго внутри зрения пользовательского входа

views.py:

from django.contrib.auth.views import login, logout 
from django.shortcuts import render, redirect 

def custom_login(request, **kwargs): 
    if request.user.is_authenticated(): 
     return redirect('/homepage/') 
    else: 
     return login(request, **kwargs) 
+1

Можете ли вы показать соответствующую часть своего вида? –

+0

@MosesKoledoye Я просто использую вид входа в систему django по умолчанию, обновленный вопрос – MohitC

ответ

2

Существует не точка проверки {% if user.is_authenticated %} в шаблоне входа. Если пользователь аутентифицирован, то ваш вид custom_login перенаправил их на домашнюю страницу.

Если учетная запись неактивна, то форма будет недействительна и пользователь не будет зарегистрирован ошибка форм будут выглядеть так:.

{'__all__': [u'This account is inactive.']} 

Поэтому проверка {% if 'inactive' in form.errors %} не будет работать, потому что ошибка хранится с ключом __all__, а не inactive.

Вы можете сделать {% if 'This account is inactive.' in form.non_field_errors %}, но это очень хрупко и сломается, если Django когда-либо изменил текст сообщения об ошибке для неактивных пользователей.

Было бы лучше отобразить фактические ошибки, а не пытаться выяснить, какая именно ошибка в шаблоне. Самый простой способ отображения ошибок, не связанных полей будет включать:

{{ form.non_field_errors }} 

Или, если вам нужно больше контроля:

{% for error in form.non_field_errors %} 
    {{ error }} 
{% endfor %} 

Если вам необходимо изменить сообщение об ошибке для неактивных пользователей, вы можете унаследовать формы аутентификации, а затем используйте это в своем браузере.

my_error_messages = AuthenticationForm.error_messages.copy() 
my_error_messages['inactive'] = 'My custom message' 

class MyAuthenticationForm(AuthenticationForm): 
    error_messages = my_error_messages 
+0

Это имеет смысл, но 'request.user.is_authenticated()' на мой взгляд заключается в том, чтобы перенаправить пользователя на главную страницу, если пользователь уже вошел в систему и пытается перейти на страницу входа в систему. Этот код не перенаправляет неактивных пользователей на главную страницу, почему? Также почему проверка is_authenticated не работает в шаблоне? – MohitC

+2

Форма аутентификации не будет регистрировать пользователя, если они неактивны. Форма недействительна с неактивным сообщением об ошибке. Поскольку неактивный пользователь не входит в систему, '{% if user.is_authenticated%}' всегда будет 'False' в шаблоне. – Alasdair

+1

Совершенно сейчас имеет смысл. Спасибо – MohitC

1

Просто в дополнение к очень разумный ответ Аласдера, в если вы действительно хотите явно проверить, существует ли пользователь, но неактивен, вы можете использовать AuthenticationForm.get_user(), то есть:

{% if form.errors %} 
    {% with form.get_user as user %} 
    {% if user %} 
     {# the user is inactive #} 
    {% else %} 
     {# no user matching username/password #} 
    {% endif %} 
    {% endwith %} 
{% endif %} 

Это предполагается, что вы По умолчанию используется django.contrib.auth.forms.AuthenticationForm - вы можете использовать свой собственный и переопределить confirm_login_allowed(), чтобы реализовать свою собственную политику.

+0

Это тоже здорово, но я пойду с альтернативами @ Аласдейра. Благодаря! – MohitC

+0

@MohitC да, это, очевидно, самая разумная вещь;) –

 Смежные вопросы

  • Нет связанных вопросов^_^