Я новичок в Django и прохожу руководство по созданию школьной системы. У меня есть CustomUser, который связан с тремя разными таблицами с помощью OneToOneField(), при регистрации пользователя, в зависимости от типа (HOD, учитель, ученик), я создаю два сигнала с помощью @receiver< /code>, чтобы создать экземпляр запроса POST, а затем сохранить его в соответствующей таблице.
Проблема:
Когда я пытаюсь сохранить данные, я использую объект CustomUser и вызываю класс create_user(), который сохраняю в пользовательской переменной, но когда я использую этот объект для сохранения других данные из таблицы нужны мне (Учителя в данном случае) пользователь не создается:
# managers.py
class CustomUserManager(BaseUserManager):
"""
Custom user model manager where email is the unique identifiers
for authentication instead of usernames.
"""
def create_user(self, email, password, **extra_fields):
"""
Create and save a user with the given email and password.
"""
if not email:
raise ValueError(_("The Email must be set"))
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
"""
Create and save a SuperUser with the given email and password.
"""
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
extra_fields.setdefault("is_active", True)
if extra_fields.get("is_staff") is not True:
raise ValueError(_("Superuser must have is_staff=True."))
if extra_fields.get("is_superuser") is not True:
raise ValueError(_("Superuser must have is_superuser=True."))
return self.create_user(email, password, **extra_fields)
# models.py
class CustomUser(AbstractUser):
username = None
email = models.EmailField(_("email address"), unique=True)
user_type_data=((1,'HOD'),(2,'staff'),(3,'users'))
user_type=models.CharField(default=1,choices=user_type_data,max_length=10)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
class AdminHOD(models.Model):
id=models.AutoField(primary_key=True)
admin=models.OneToOneField(CustomUser,on_delete=models.CASCADE)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now_add=True)
objects=models.Manager()
class Teachers(models.Model):
id=models.AutoField(primary_key=True)
admin=models.OneToOneField(CustomUser,on_delete=models.CASCADE)
phone=PhoneNumberField()
address=models.TextField()
course_id=models.ManyToManyField(Courses)
subject_id=models.ManyToManyField(Subjects)
section_id=models.ManyToManyField(Sections)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now_add=True)
class Students(models.Model):
id=models.AutoField(primary_key=True)
admin=models.OneToOneField(CustomUser,on_delete=models.CASCADE)
idCard=models.PositiveIntegerField(unique=True)
age=models.PositiveSmallIntegerField()
gender=models.CharField(max_length=255,)
phone=PhoneNumberField()
address=models.TextField()
profile_pic=models.FileField()
session_start=models.DateField()
session_end=models.DateField()
course_id=models.ForeignKey(Courses,on_delete=models.SET_DEFAULT, default=1)
sections_id=models.ForeignKey(Sections,on_delete=models.SET_DEFAULT, default=1)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now_add=True)
# Receive a signal to create a new user with certain type
@receiver(post_save,sender=CustomUser)
def create_user_profile(sender,instance,created,**kwargs):
if created:
if instance.user_type == 1:
AdminHOD.objects.create(admin=instance)
if instance.user_type == 2:
Teachers.objects.create(admin=instance)
if instance.user_type == 3:
Students.objects.create(admin=instance)
# Save the user
@receiver(post_save,sender=CustomUser)
def save_user_profile(sender,instance,**kwargs):
if instance.user_type == 1:
instance.adminhod.save()
if instance.user_type == 2:
instance.teachers.save()
if instance.user_type == 3:
instance.students.save()
Если я закомментирую строку user.Teachers.address=request.POST.get('address'), то пользователь создаётся без проблем и экземпляр в Учителях Таблица создается с пустым полем адреса.
Мне нужно понять, почему возникает ошибка и как ее исправить. Я думал о создании собственной модели для каждой таблицы вместо использования CustomUser и последующего обращения к другим таблицам, но я не знаю, насколько оптимально это решение. Также приветствуются любые советы по улучшению кода. Спасибо
РЕДАКТИРОВАНИЕ: обратная трассировка.
Я новичок в Django и прохожу руководство по созданию школьной системы. У меня есть CustomUser, который связан с тремя разными таблицами с помощью OneToOneField(), при регистрации пользователя, в зависимости от типа (HOD, учитель, ученик), я создаю два сигнала с помощью @receiver< /code>, чтобы создать экземпляр запроса POST, а затем сохранить его в соответствующей таблице. Проблема: [list] [*]Когда я пытаюсь сохранить данные, я использую объект CustomUser и вызываю класс create_user(), который сохраняю в пользовательской переменной, но когда я использую этот объект для сохранения других данные из таблицы нужны мне (Учителя в данном случае) пользователь не создается: [/list] [code]def create_teachers(request): if auth_user(request) == True: # Do something for authenticated users. if request.method == 'GET': return render(request, 'create_teachers.html') else: try: user = CustomUser.objects.create_user( password='defaultPass', first_name=request.POST.get('first_name'), last_name=request.POST.get('last_name'), email=request.POST.get('email'), user_type=2, ) user.Teachers.address=request.POST.get('address') user.save() print('Professor created successfully') return redirect('/auth/create_teachers') except: print('Error creating teacher') return redirect('/auth/create_teachers') else: return redirect('../login') [/code] [code]Error creating teacher [27/Sep/2024 13:46:14] "POST /auth/create_teachers HTTP/1.1" 302 0 [27/Sep/2024 13:46:14] "GET /auth/create_teachers HTTP/1.1" 200 34724 [27/Sep/2024 13:46:14] "GET /static/css/dist/styles.css?v=1727459174 HTTP/1.1" 200 54543 [/code] [code]# admin.py class UserAdmin(BaseUserAdmin): ordering = ('email',)
admin.site.register(CustomUser, UserAdmin) [/code] [code]# managers.py class CustomUserManager(BaseUserManager): """ Custom user model manager where email is the unique identifiers for authentication instead of usernames. """ def create_user(self, email, password, **extra_fields): """ Create and save a user with the given email and password. """ if not email: raise ValueError(_("The Email must be set")) email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) user.save() return user
def create_superuser(self, email, password, **extra_fields): """ Create and save a SuperUser with the given email and password. """ extra_fields.setdefault("is_staff", True) extra_fields.setdefault("is_superuser", True) extra_fields.setdefault("is_active", True)
if extra_fields.get("is_staff") is not True: raise ValueError(_("Superuser must have is_staff=True.")) if extra_fields.get("is_superuser") is not True: raise ValueError(_("Superuser must have is_superuser=True.")) return self.create_user(email, password, **extra_fields) [/code] [code]# models.py class CustomUser(AbstractUser): username = None email = models.EmailField(_("email address"), unique=True) user_type_data=((1,'HOD'),(2,'staff'),(3,'users')) user_type=models.CharField(default=1,choices=user_type_data,max_length=10)
USERNAME_FIELD = "email" REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self): return self.email
class AdminHOD(models.Model): id=models.AutoField(primary_key=True) admin=models.OneToOneField(CustomUser,on_delete=models.CASCADE) created_at=models.DateTimeField(auto_now_add=True) updated_at=models.DateTimeField(auto_now_add=True) objects=models.Manager()
# Receive a signal to create a new user with certain type @receiver(post_save,sender=CustomUser) def create_user_profile(sender,instance,created,**kwargs): if created: if instance.user_type == 1: AdminHOD.objects.create(admin=instance)
if instance.user_type == 2: Teachers.objects.create(admin=instance)
if instance.user_type == 3: Students.objects.create(admin=instance)
# Save the user @receiver(post_save,sender=CustomUser) def save_user_profile(sender,instance,**kwargs): if instance.user_type == 1: instance.adminhod.save()
if instance.user_type == 2: instance.teachers.save()
if instance.user_type == 3: instance.students.save() [/code] Если я закомментирую строку user.Teachers.address=request.POST.get('address'), то пользователь создаётся без проблем и экземпляр в Учителях Таблица создается с пустым полем адреса. Мне нужно понять, почему возникает ошибка и как ее исправить. Я думал о создании собственной модели для каждой таблицы вместо использования CustomUser и последующего обращения к другим таблицам, но я не знаю, насколько оптимально это решение. Также приветствуются любые советы по улучшению кода. Спасибо РЕДАКТИРОВАНИЕ: обратная трассировка. [img]https://i.sstatic.net/AWtfOO8J.png [/img]