Ошибка при создании пользователя - Python
Формулировка задачи:
Всем привет. Не могу понять почему возникает исключение при создании пользователя через админку.
Traceback
Код модели Profile
код Profile.admin.py
Самое интересное что когда я создаю пользователя напрямую
То юзер создается и как положено вместе с профайлом. Помогите разобраться в чем проблема может быть?
Спойлер
Листинг программы
- from django.db import models
- from django.contrib.auth.models import User
- from django.db.models.signals import post_save
- from django.dispatch import receiver
- from Stream.models import Stream
- class Profile(models.Model):
- # TODO ошибка при создании нового пользователя из админки!
- user = models.OneToOneField(User, on_delete=models.CASCADE)
- stream = models.OneToOneField(Stream, on_delete=models.SET_NULL, default=None, null=True, blank=True)
- last_lesson_date = models.DateField(default=None, null=True, blank=True)
- avatar = models.ImageField(default=None, null=True, blank=True, upload_to='uploads/Profile/')
- @receiver(post_save, sender=User)
- def create_user_profile(sender, instance, created, **kwargs):
- if created:
- Profile.objects.create(user=instance)
- @receiver(post_save, sender=User)
- def save_user_profile(sender, instance, **kwargs):
- instance.profile.save()
Листинг программы
- from django.contrib import admin
- from .models import User, Profile
- from django.contrib.auth.admin import UserAdmin
- admin.site.unregister(User)
- class UserActivitiesInline(admin.StackedInline):
- model = Profile
- max_num = 1
- min_num = 1
- def has_delete_permission(self, request, obj=None):
- return False
- @admin.register(User)
- class ProfileAdmin(UserAdmin):
- inlines = [UserActivitiesInline]
Листинг программы
- >>> from django.contrib.auth.models import User
- >>> User.objects.create(username='test2', password='Qazxsw21')
- <User: test2>
Решение задачи: «Ошибка при создании пользователя»
textual
Листинг программы
- @receiver(post_save, sender=User)
- def create_user_profile(sender, instance, created, **kwargs):
- # Этот сигнал неправильно закодин, при создании профайла для пользователя когда из админки указан объект Stream
- # то этот код по сути уберет значение поля stream так как создаст профайл только с атрибутом user, что в дальнейшем и
- # вывалится в ошибку. Поэтому этот метод нужно вообще убрать так как есть сигнал ниже да и вообще создание
- # объекта Profile происходит автоматом.
- if created:
- Profile.objects.create(user=instance)
- @receiver(post_save, sender=User)
- def save_user_profile(sender, instance, **kwargs):
- # Правда не все так просто, если при создании пользователя никакие поля Profile не трогать, а в объекте Profile
- # нет required полей, то объект Profile созда не будет. А этот код вывалит ошибку так как в поле Profile.user_id
- # будет None вместо id пользователя. Тогда надо просто добавить заполнение Profile.user_id принудительно если
- # сигнал создает пользователя
- if kwargs['created']:
- instance.profile.user_id = instance.id
- # вот и все)
- instance.profile.save()
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д