Редактирование связанного поля на странице редактирования родительской модели

Моя 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 со страницы подробной информации о пользователе.

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