#python #django #model
Вопрос:
Я создаю приложение 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()
Я вошел в систему, но это ошибка.
Моя модель билета:
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
У пользователя может быть несколько билетов. Но он не принимает ни одного пользователя. Всякий раз, когда я пытаюсь перейти на маршрут билета, он вызывает меня для входа в систему. Я так и делаю, но потом он выдает эту ошибку.
Комментарии:
1. В чем заключается ошибка, которую вы получаете?
2. ошибка:У билета нет клиента.
3. на этот раз я был перенаправлен на вход и смог войти, но ошибка git «у билета нет клиента»
4. У вас есть бланк для билета? Если нет, ваш класс билета должен быть: билет класса(формы.Форма): — а не модели
5. Я сделал билет класса(формы.Форма): но я получил следующее:Ошибка типа: объект ‘DeclarativeFieldsMetaclass’ не может быть повторен
Ответ №1:
Эта ошибка отображается вам, потому что вы объявляете значение from равным модели в :
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})
Вы можете получить более подробную информацию в документах