Ошибка при создании пользователя - Python

Узнай цену своей работы

Формулировка задачи:

Всем привет. Не могу понять почему возникает исключение при создании пользователя через админку. Traceback
Спойлер
Код модели Profile
Листинг программы
  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. from django.db.models.signals import post_save
  4. from django.dispatch import receiver
  5. from Stream.models import Stream
  6.  
  7. class Profile(models.Model):
  8. # TODO ошибка при создании нового пользователя из админки!
  9. user = models.OneToOneField(User, on_delete=models.CASCADE)
  10. stream = models.OneToOneField(Stream, on_delete=models.SET_NULL, default=None, null=True, blank=True)
  11. last_lesson_date = models.DateField(default=None, null=True, blank=True)
  12. avatar = models.ImageField(default=None, null=True, blank=True, upload_to='uploads/Profile/')
  13.  
  14. @receiver(post_save, sender=User)
  15. def create_user_profile(sender, instance, created, **kwargs):
  16. if created:
  17. Profile.objects.create(user=instance)
  18.  
  19. @receiver(post_save, sender=User)
  20. def save_user_profile(sender, instance, **kwargs):
  21. instance.profile.save()
код Profile.admin.py
Листинг программы
  1. from django.contrib import admin
  2. from .models import User, Profile
  3. from django.contrib.auth.admin import UserAdmin
  4. admin.site.unregister(User)
  5.  
  6. class UserActivitiesInline(admin.StackedInline):
  7. model = Profile
  8. max_num = 1
  9. min_num = 1
  10. def has_delete_permission(self, request, obj=None):
  11. return False
  12.  
  13. @admin.register(User)
  14. class ProfileAdmin(UserAdmin):
  15. inlines = [UserActivitiesInline]
Самое интересное что когда я создаю пользователя напрямую
Листинг программы
  1. >>> from django.contrib.auth.models import User
  2. >>> User.objects.create(username='test2', password='Qazxsw21')
  3. <User: test2>
То юзер создается и как положено вместе с профайлом. Помогите разобраться в чем проблема может быть?

Решение задачи: «Ошибка при создании пользователя»

textual
Листинг программы
  1. @receiver(post_save, sender=User)
  2. def create_user_profile(sender, instance, created, **kwargs):
  3.     # Этот сигнал неправильно закодин, при создании профайла для пользователя когда из админки указан объект Stream
  4.     # то этот код по сути уберет значение поля stream так как создаст профайл только с атрибутом user, что в дальнейшем и
  5.     # вывалится в ошибку. Поэтому этот метод нужно вообще убрать так как есть сигнал ниже да и вообще создание
  6.     # объекта Profile происходит автоматом.
  7.     if created:
  8.         Profile.objects.create(user=instance)
  9.  
  10.  
  11. @receiver(post_save, sender=User)
  12. def save_user_profile(sender, instance, **kwargs):
  13.     # Правда не все так просто, если при создании пользователя никакие поля Profile не трогать, а в объекте Profile
  14.     # нет required полей, то объект Profile созда не будет. А этот код вывалит ошибку так как в поле Profile.user_id
  15.     # будет None вместо id пользователя. Тогда надо просто добавить заполнение Profile.user_id принудительно если
  16.     # сигнал создает пользователя
  17.     if kwargs['created']:
  18.         instance.profile.user_id = instance.id
  19.     # вот и все)
  20.     instance.profile.save()

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы