Сайт администратора для пользовательской модели пользователя и расширенной модели пользователя

Моему приложению Django нужна пользовательская модель пользователя и некоторые дополнительные поля, поэтому я определил их следующим образом:

Пользовательская модель и менеджер (определены в приложении под названием users):

class CustomUserManager(BaseUserManager):

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self._create_user(email, password, **extra_fields)


class CustomUser(AbstractUser):
    username = None
    email = models.EmailField(unique=True)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email
<
class Customer(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    created = models.DateField(auto_now_add=True)
Дополнительное поле модели (определенное в приложении под названием ): <
class CustomerInline(admin.StackedInline):
    model = Customer
    readonly_fields = ('created',)


@admin.register(CustomUser)
class CustomUserAdmin(UserAdmin):

    inlines = (CustomerInline,)

    list_display = ('email', 'is_active', 'is_staff', 'is_superuser')

    list_filter = ('email', 'is_active', 'is_staff', 'is_superuser')

    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('first_name', 'last_name')}),
        (
            ('Permissions'),
            {
                'fields': (
                    'is_active',
                    'is_staff',
                    'is_superuser',
                    'groups',
                    'user_permissions',
                )
            },
        ),
    )

    add_fieldsets = (
        (
            None,
            {
                'classes': ('wide',),
                'fields': (
                    'email',
                    'password1',
                    'password2',
                    'is_active',
                    'is_staff',
                    'is_superuser',
                ),
            },
        ),
    )

    search_fields = ('email',)

    ordering = ('email',)

Админ сайта работает почти нормально, за исключением того, что ничего не показывается для поля created, в то время как оно должно показывать дату создания пользователя.

Я знаю, что в Django есть date_joined, и я могу использовать его вместо этого. Вопрос в том, почему мой инлайн не работает должным образом.

enter image description here

Ваш Customer не создается вместе с CustomUser автоматически. То, что вы видите в админке - это просто форма для добавления нового клиента со всеми полями, доступными для чтения. Как только вы сохраните ее, я предполагаю, что клиент также будет создан. Однако вы должны сделать это в сценариях, где цель состоит в том, чтобы CustomUser всегда имел прикрепленного клиента. Вы можете либо поместить его непосредственно в место создания CustomUser'ов, например, в админку, регистрацию и т.д. Либо использовать сигнал при создании CustomUser, который создает также и Customer.

Вернуться на верх