Объект не имеет атрибута '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>

Надеюсь, это поможет вам.

Вернуться на верх