Объект не имеет атрибута 'set_password'
Я получаю сообщение об ошибке 'UserProfileInfo' object has no attribute 'set_password' Я не могу найти, что я упустил, я сделал несколько проектов, подобных этому, но никогда не сталкивался с такой ошибкой. Есть ли что-то, что я упускаю. Я пытался исправить это в течение последнего часа, но все еще не повезло Я буду признателен, если вы поможете мне
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from .forms import UserForm , LoginForm
# Create your views here.
def home(request):
if not request.user.is_authenticated:
message = "You are not logged in"
return render(request,'home.html',{"MESSAGE":message})
else:
message = "You are logged in"
return render(request,'home.html',{"MESSAGE":message})
def Register(request):
registered = False
if request.method == 'POST':
user_form = UserForm(data=request.POST)
if user_form.is_valid():
user = user_form.save()
user.set_password(user.password)
user.save()
registered = True
else:
print(user_form.errors)
else:
user_form = UserForm()
return render(request,'signup.html',
{'user_form': user_form,'registered':registered})
def user_login(request):
if request.method == 'POST':
login_info = LoginForm(request.POST)
if login_info.is_valid():
user = authenticate(username = login_info.cleaned_data["username"], password=login_info.cleaned_data["password"])
if user:
login(request,user)
return HttpResponseRedirect(reverse('Home'))
else:
return HttpResponse("Wrong")
else:
login_info = LoginForm()
return render(request,"login.html",{'logininfo':login_info})
Моя форма
from cProfile import label
from re import L
from django import forms
from django.contrib.auth.models import User
from .models import Message,Room
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
class Meta():
model = User
fields = ('username','email','password')
labels = {
'username' : ('USERNAME!!')
}
help_texts = {
'username' : 'Make It Unique'
}
class MessageForm(forms.ModelForm):
class Meta():
model = Message
fields = "__all__"
class LoginForm(forms.Form):
username = forms.CharField(label = 'Your username')
password = forms.CharField(label= "Don't tell any but us",widget=forms.PasswordInput())
Модели
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User
# Create your models here.
class Room(models.Model):
room_name = models.CharField(max_length=250)
def __str__(self):
return self.room_name
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
def __str__(self):
return self.user.username
class Message(models.Model):
userinfo = models.ForeignKey(UserProfile,on_delete=models.CASCADE)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
message = models.CharField(max_length=250)
date = models.DateTimeField(default=datetime.now, blank=True)
def __str__(self):
return self.message
Лучший способ создания регистрации пользователя и входа в систему:
Аутентификация пользователей:
authenticate(request=None, **credentials)
Используйте authenticate() для проверки набора учетных данных. Она принимает учетные данные в качестве ключевых аргументов, имя пользователя и пароль для случая по умолчанию, проверяет их на каждом бэкенде аутентификации и возвращает объект User, если учетные данные действительны для бэкенда. Если учетные данные не действительны ни для одного бэкенда или если бэкенд выдает PermissionDenied, возвращается None. Например:
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(request, username=username, password=password)
if user is not None:
auth.login(request, user)
return redirect('Home')
else:
messages.info(request, 'Invalid Credential')
return redirect('login')
else:
return render(request, 'login.html')
Шаблон:
<form method="POST" action="{% url 'login' %}">
{% csrf_token %}
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">Enter Username</label>
<input type="text" class="form-control" name="username" placeholder="Enter Username">
</div>
<br>
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">Enter Password</label>
<input type="password" class="form-control" name="password" placeholder="Enter Password">
</div>
<br>
<div class="form-check">
<label class="form-check-label" for="exampleCheck1">New To This Platform
<a href="{% url 'register' %}">Sign Up</a>
<br>
</label>
</div>
<br>
<button type="submit" class="btn btn-primary btn-block">Log in</button>
</form>
просмотров регистраций:
Объекты пользователя¶ Объекты пользователя являются ядром системы аутентификации. Они обычно представляют людей, взаимодействующих с вашим сайтом, и используются для таких вещей, как ограничение доступа, регистрация профилей пользователей, ассоциирование контента с создателями и т.д. В системе аутентификации Django существует только один класс пользователей, т.е. пользователи 'superusers' или admin 'staff' - это просто объекты пользователей с установленными специальными атрибутами, а не различные классы объектов пользователей.
Основными атрибутами пользователя по умолчанию являются:
username
password
email
first_name
last_name
взгляд:
def register(request):
if request.method == 'POST':
username = request.POST['username']
first_name = request.POST['first_name']
last_name = request.POST['last_name']
email = request.POST['email']
password = request.POST['password']
password2 = request.POST['password2']
if password == password2:
if User.objects.filter(email=email).exists():
messages.info(request, 'Email Or Username Already Taking')
return redirect('register')
elif User.objects.filter(username=username).exists():
messages.info(request, 'Username Is Taken')
return redirect('register')
else:
user = User.objects.create_user(username=username, first_name=first_name, last_name=last_name, email=email, password=password)
user.save();
return redirect('Home')
else:
messages.info(request, 'Password Not Match')
return redirect('register')
return redirect ('/')
else:
return render(request, 'signup.html')
Шаблон:
<form method="POST" action="{% url 'register' %}">
{% csrf_token %}
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">Username</label>
<input type="text" class="form-control" placeholder="Enter Your Username" name="username">
</div>
<br>
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">Email</label>
<input type="email" class="form-control" placeholder="Enter Your Email" name="email" >
</div>
<br>
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">First Name</label>
<input type="text" class="form-control" placeholder="First Name" required name="first_name">
</div>
<br>
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">Last Name</label>
<input type="text" class="form-control" placeholder="Last Name" required name="last_name">
</div>
<br>
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">Enter Password</label>
<input type="password" class="form-control" placeholder="Enter Password" name="password">
</div>
<br>
<div class="form-group">
<label class="text-primary text-dark font-weight-bold">Confirm Password</label>
<input type="password" class="form-control" placeholder="Confirm Password" name="password2">
</div>
</form>
Надеюсь, это поможет вам.