Аутентификация входа пользователя в Django
Я хочу зарегистрировать пользователя на простом веб-сайте. Я пытался создать свою собственную аутентификацию входа, но она отправляет эту ошибку:
AttributeError at /login/ , объект 'QuerySet' не имеет атрибута 'pk'
вот код (views.py) :
...
from django.contrib.auth import login as login_module
def login(request):
if request.method == "POST":
Login = LoginFrom(request.POST)
if Login.is_valid():
user = Login.cleaned_data
if User.objects.filter(username=user['username']).exists():
user_info = User.objects.filter(username=user['username'] ,
password=user['password']).values('name')
if user_info.exists():
login_module(request, user_info)
messages.success(request, 'welcome {}'.format(user_info[0]['name'] ) , 'welcome_message')
else:
messages.error(request, 'wrong password', 'password_message')
else:
messages.error(request, 'username doesn\'t exist', 'username_message')
else:
Login = LoginFrom()
return render(request, 'login.html')
Затем я заменил его на этот код, взятый из документа django; это привело меня к другой проблеме, которая всегда возвращает 'None':
views.py
...
...
from django.contrib.auth import authenticate
from django.contrib.auth import login as login_module
def login(request):
if request.method == "POST":
Login = LoginFrom(request.POST)
if Login.is_valid():
cd = Login.cleaned_data
user = authenticate(request, username = cd['username'], password = cd['password'])
if user is not None:
login_module(request, user)
messages.success(request, 'login', 'welcome_message')
else:
messages.error(request, 'error (none)', 'error_message')
else:
Login = LoginFrom()
return render(request, 'login.html')
(form.py) в обоих вариантах:
class LoginFrom(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
я пропустил какую-то часть или должен установить какую-то настройку?
В вашем первом решении,
password=user['password']
всегда будет неудачным, поскольку пароль, сохраненный в таблице auth_user по умолчанию, будет иметь хэшированный пароль.
Я попробовал второе решение, и оно работает нормально. Это представление входа не может вернуть None, потому что единственный оператор возврата возвращает метод render.
Поделитесь, пожалуйста, шаблоном login.html.