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