Модуль 'django.contrib.messages.constants' не имеет атрибута 'error'
Я работал над своим проектом django, и все казалось прекрасным, пока я просто не захотел войти в систему, и я обнаружил эту ошибку:
module 'django.contrib.messages.constants' has no attribute 'error'
Код, который отвечает за это, не трогали как минимум 2 месяца!
Вот вид:
from django.contrib.auth import authenticate
from django.conf.settings import *
from django.contrib import messages
# Connexion
def loginview(request):
if request.method == 'POST':
usr = request.POST.get('email_kw')
pwd = request.POST.get('pwd_kw')
user = authenticate(request, username=usr, password=pwd)
if user is not None:
login(request, user)
logger.info(f"Connexion de {request.user}")
return redirect("dashboard")
else:
messages.error(request, "Erreur: Nom d'utilisateur ou mot de passe incorrects, veuillez réessayer.") # this is the line that causes the problem
logger.error(f'Connexion de {request.user} echouee')
return render(request, 'core/login.html', {'page_title': 'Se connecter'})
if request.user.is_authenticated:
return redirect("dashboard")
return render(request, 'core/login.html', {'page_title': 'Se connecter'})
Это очень сложная проблема. А ответ прост.
Хотя вы импортировали правильный компонент (который является django.contrib.messages
), вы также импортировали настройки, вероятно, для использования некоторых глобальных переменных.
Проблема здесь в том, что вы импортировали ВСЕ переменные и методы в settings.py, а поскольку вы используете сообщения, вы наверняка используете bootstrap alerts, следовательно, вы импортируете константы сообщений в ваш settings.py (django.contrib.messages.constants
).
Во многих учебниках вас просят поставить вот это: from django.contrib.messages import constants as messages
.
Теперь у вас есть следующее:
from django.conf.settings import *
from django.contrib import messages
Что означает, что вы импортируете настройки до сообщений, что означает, что сообщения, которые вы используете, являются константами.
Для решения этой проблемы вы можете просто переименовать константы в настройках на что-то другое, а не на сообщения. Или просто следуйте хорошей практике любой объектно-ориентированной программной инженерии, и никогда не используйте import *
, всегда импортируйте только те переменные или функции, которые вам действительно нужны, и поэтому измените from django.conf.settings import *
на from django.conf import settings
и используйте settings.YOUR_VARIABLE
, или, вы можете сделать также следующее: from django.conf.settings import YOUR_VARIABLE, YOUR_METHOD