Редактирование связанного поля на странице редактирования родительской модели
Моя Profile
модель имеет OneToOne
поле с User
моделью.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
verified = models.BooleanField(default=False)
А ModelAdmin
определяется следующим образом:
class UserAdmin(UserAdmin):
fieldsets = (
....
....
('Permissions'),
'fields': (
'is_active',
'is_staff',
'is_superuser',
....
....
Возможно ли добавить verified
файл к вышеуказанному (например, после is_superuser
), чтобы я мог редактировать его на той же странице, что и остальную часть User
модели?
P.S: Мне уже удалось добавить его в list_display
и list_filter
из User
.
Вы можете использовать переопределение AbstractUser из модели Django, так что вы можете объединить пользователей в одном месте, как это:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
verified = models.BooleanField(default=False)
и вам нужно добавить эту строку в файл Django settings.py, чтобы Django знал, что нужно использовать новый класс User:
AUTH_USER_MODEL = 'users.CustomUser'
тогда обязательно мигрируйте :
(env)$ python manage.py makemigrations
(env)$ python manage.py migrate
Расширение пользовательской модели в сравнении с наследованием.
Ваша модель профиля добавляет пользователю только некоторые элементы. В этом случае наследование модели может быть лучше.
# models.py
class Profile(user):
verified = models.BooleanField(default=False)
после этого вы можете достичь всех полей для пользователя и для профиля:
# admin.py
class ProfileAdmin(ModelAdmin):
fields = '__all__'
если вы не хотите включать наследование модели.
Вы можете использовать InlineModel в UserAdmin для изменения связанной модели.
# admin.py
class ProfileInline(StackedInline):
model=Profile
class UserAdmin(ModelAdmin):
inlines = (ProfileInline, )
OP может использовать один из объектов InlineModelAdmin
, таких как StackedInline
. Это позволяет создавать встроенные формы, обеспечивающие возможность редактирования моделей на той же странице, что и родительская модель.
Применительно к случаю ОП, это будет что-то вроде
from django.contrib import admin
class ProfileInline(admin.StackedInline):
model = Profile
class UserAdmin(admin.ModelAdmin):
inlines = [
ProfileInline,
]
admin.site.register(User, UserAdmin)
Теперь администраторский сайт OP настроен на редактирование объектов профиля в режиме inline со страницы подробной информации о пользователе.