Невозможно сохранить пользовательскую модель с новыми данными
Django 4.2.5, python 3.11, сохранение в mysql db.
Я пытаюсь обновить поле «chat_user_status» для моей модели «Teacher», которая расширяет абстрактную модель User.
Model.py код для учителя:
class TeacherProfile(models.Model):
teacher = models.OneToOneField(
UserProfile, related_name='teacher', primary_key=True, parent_link=True, on_delete=models.CASCADE)
chat_user_status = models.BooleanField(default=False, verbose_name='Chat Status')
def save(self, *args, **kwargs):
identity = self.teacher.email
friendlyName = self.teacher.first_name + \
' ' + self.teacher.last_name
super(TeacherProfile, self).save(*args, **kwargs)
Views.py (модель Teacher) код входа, который пытается обновить поле chat_user_status, и ничего не обновляется, и нет ошибки:
def login_user(request):
logout(request)
email = password = ''
if request.POST:
email = request.POST['email']
password = request.POST['password']
user = authenticate(username=email, password=password)
if user is not None:
if user.is_active:
login(request, user)
if is_teacher(user):
user.chat_user_status=True
user.save()
Views.py соответствующий код из моего приложения чата, который пытается сохранить данные
def update_chatuser_status(uid):
user_profile = UserProfile.objects.get(id=uid)
teacher_profile = None
try:
teacher_profile = TeacherProfile.objects.get(teacher_id=user_profile.id)
except:
pass
if teacher_profile != None:
teacher_profile['chat_user_status']=False
teacher_profile.save()
После вызова save() поле 'chat_user_status' не изменилось. Нет сообщения об ошибке. Я искал другие ответы, но они либо не работают, либо не имеют отношения к делу.
Насколько я понимаю, у вас две отдельные ошибки, которые приводят к тому, что поле не обновляется.
В login_user()
вы работаете с объектом UserProfile
, у которого нет поля chat_user_status
. Вместо этого вам нужно получить доступ к подключенному TeacherProfile
и сохранить его с новым свойством:
if is_teacher(user):
user.teacherprofile.chat_user_status=True
user.teacherprofile.save()
в update_chatuser_status
вы обращаетесь к свойству как к ключу dict, что не работает. Вместо этого вы должны обращаться к полю следующим образом:
if teacher_profile != None:
teacher_profile.chat_user_status=False
teacher_profile.save()