Как сохранить данные в две связанные таблицы в Django?Python

Программы на Python
Ответить
Anonymous
 Как сохранить данные в две связанные таблицы в Django?

Сообщение Anonymous »

Я новичок в Django и прохожу руководство по созданию школьной системы. У меня есть CustomUser, который связан с тремя разными таблицами с помощью OneToOneField(), при регистрации пользователя, в зависимости от типа (HOD, учитель, ученик), я создаю два сигнала с помощью @receiver< /code>, чтобы создать экземпляр запроса POST, а затем сохранить его в соответствующей таблице.
Проблема:
  • Когда я пытаюсь сохранить данные, я использую объект CustomUser и вызываю класс create_user(), который сохраняю в пользовательской переменной, но когда я использую этот объект для сохранения других данные из таблицы нужны мне (Учителя в данном случае) пользователь не создается:

Код: Выделить всё

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')

Код: Выделить всё

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

Код: Выделить всё

# admin.py
class UserAdmin(BaseUserAdmin):
ordering = ('email',)

admin.site.register(CustomUser, UserAdmin)

Код: Выделить всё

# 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 и последующего обращения к другим таблицам, но я не знаю, насколько оптимально это решение. Также приветствуются любые советы по улучшению кода. Спасибо
РЕДАКТИРОВАНИЕ: обратная трассировка.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-django
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»