Django - Пользовательская модель не может отображаться на модели User
Я создал модель в Django v4, и хочу показать информацию внутри представления User admin. После миграции новая таблица была успешно создана и данные сохраняются. Вот код:
models.py
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE
)
address = models.CharField(
max_length=20,
blank=True,
null=True
)
def __str__(self):
return self.user.username
admin.py
from django.contrib import admin
from django.contrib.auth.models import User
from .models import Profile
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'Extra Information'
@admin.register(ProfileInline)
class UserAdmin(admin.ModelAdmin):
inlines = [
ProfileInline,
]
В созданной таблице хранятся следующие данные:
id | address | user_id |
---|---|---|
3 | Test | 2 |
Где столбец user_id является внешним ключом из таблицы auth_user, которая создается автоматически (я полагаю?).
Теперь, когда я пытаюсь запустить, makemigrations и т.д., он показывает мне следующее:
AttributeError: type object 'ProfileInline' has no attribute '_meta'
Каким образом можно добавить информацию к пользователю, как это делают разделы по умолчанию?
Я нашел решение. admin.py должен выглядеть следующим образом:
from django.contrib import admin
from django.contrib.auth.models import User
from .models import Profile
class ProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'Extra Information'
class UserAdmin(admin.ModelAdmin):
inlines = [
ProfileInline,
]
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
В этом случае лучшим подходом будет наследование класса Django AbstractUser, добавление своих дополнительных полей, а затем установка AUTH_USER_MODEL
в настройках Django, чтобы django использовал вашу модель для аутентификации.
https://docs.djangoproject.com/en/4.0/ref/settings/#std-setting-AUTH_USER_MODEL
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class Profile(AbstractUser):
address = models.CharField(
max_length=20,
blank=True,
null=True
)
def __str__(self):
return self.username
settings.py
AUTH_USER_MODEL = "<your_app_name>.Profile"