Вход в систему аутентификации Django

Я создаю приложение Django. Я настроил модель User. Мой models.py:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from phonenumber_field.modelfields import PhoneNumberField
from phonenumber_field.phonenumber import PhoneNumber

# Create your models here.

class UserManager(BaseUserManager):
    def create_user(self, phone_number,username,email=None, password=None):
        if not phone_number:
            raise ValueError("You must specify your phone number")
        if not username:
            raise ValueError("You must specify your username")
        
        try:
            user = self.model(phone_number= PhoneNumber.from_string(phone_number=phone_number,region="BD").as_national,
                                                                    username=username,
                                                                    email=self.normalize_email(email))
        except :
            user = self.model(phone_number= PhoneNumber.from_string(phone_number=phone_number,region="BD").as_national,
                                                                    username=username)
        user.save(using=self._db)
        return user

    def create_stuffuser(self, phone_number,username,email,password):
        user = self.create_user(phone_number,username,email=email,password=password)
        user.staff = True
        user.save(using=self._db)
        return user

    def create_superuser(self, phone_number,username,email,password):
        user = self.create_user(phone_number,username,email=email,password=password)
        user.staff = True
        user.admin= True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser):
    phone_number = PhoneNumberField(unique=True)
    username = models.CharField(unique=False,max_length=50)

    REQUIRED_FIELDS = ['username']

    email = models.EmailField(unique=False)

    is_active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'phone_number'

    def get_full_name(self):
        return self.username
    
    def get_short_name(self):
        return self.username
    
    def get_email(self):
        return self.email
    
    def __str__(self):
        return str(self.phone_number)
    
    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self,app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    objects = UserManager()

Теперь, @login_required не работает. Я попытался аутентифицировать пользователя и войти в систему с помощью встроенной функции аутентификации и входа:

def loginfunc(response):
    if response.method == 'POST':
        ph = response.POST['ph']
        pw = response.POST['pw']
        user = authenticate(phone_number=ph,password=pw)
        if user:
            print(user)
            login(response,user)
            return redirect('main-home-page')
        else:
            pass

    return render(response,'register/login.html',{})

@login_required не работает здесь:

@csrf_protect
@login_required
def buyticket(response):
    if response.method == 'POST':
        form = Ticket(response.POST)
        if form.is_valid():
            form.save()
            return redirect('main-home-page')
    else:
        form = Ticket()

    return render(response,'main/ticket.html',{'form':form})

Если я не вошел в систему, он должен перенаправить меня на страницу входа. Но он выдает ошибку. Моя модель билета:

User = settings.AUTH_USER_MODEL
class Ticket(models.Model):
    from_station = models.CharField(max_length=30)
    to_station = models.CharField(max_length=30)
    purchased_on = models.DateTimeField(default=timezone.now)
    travel_on = models.DateTimeField()
    customer = models.ForeignKey(User,on_delete=models.CASCADE)

    def __str__(self):
        return f"Customer:{self.customer.username},From:{self.from_station},To:{self.to_station},Travel on:{self.travel_on},Purchased on:{self.purchased_on}"
    

Эта ошибка показывает вам причину Вы объявляете модель from equal to в :

 else:
        form = Ticket()

Вам следует создать в приложении еще один файл с именем forms.py и сделать что-то вроде этого

from .models import Ticket
from django.forms import ModelForm

class TicketForm(ModelForm):
     class Meta:
          model = Ticket
          fields = '__all__

и в представлениях

from .forms import TicketForm

def buyticket(response):
    form = TicketForm()
    if response.method == 'POST':
        if form.is_valid():
            form.save()
            return redirect('main-home-page')
    else:
        form = TicketForm()

    return render(response,'main/ticket.html',{'form':form})


Вы можете получить больше информации в docs

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