Django外键没有得到任何用户



我正在构建一个Django应用程序。我已经自定义了用户模型。我的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()

我登录了,但它抛出错误。My Ticket model:

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}"

我views.py:

@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})

我得到的错误:

Ticket has no customer.
Request Method:     GET
Request URL:    http://127.0.0.1:8000/ticket/
Django Version:     3.2.4
Exception Type:     RelatedObjectDoesNotExist
Exception Value:    
Ticket has no customer.
Exception Location:     C:UsersHPAppDataLocalProgramsPythonPython39libsite-packagesdjangodbmodelsfieldsrelated_descriptors.py, line 197, in __get__
Python Executable:  C:UsersHPAppDataLocalProgramsPythonPython39python.exe
Python Version:     3.9.2

一个用户可以有多个票。但它不接受任何用户。每当我想去售票路线,它叫我登录。我这样做了,但是它会抛出这个错误。

这个错误显示给你的原因是你声明了from等于model:

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

中获得更多信息

最新更新