Django Admin: как отобразить поля из двух различных моделей в том же представлении?

Мой сайт использует модель User Authentication User Django и пользовательскую модель UserProfile, чтобы хранить некоторые дополнительные данные (день рождения, и т.д.). Существует ли способ создать представление в администраторе Django, который ткет вместе поля от обоих модели User и UserProfile?

Я подозреваю, что этот фрагмент кода даже не близок, но возможно он поможет проиллюстрировать то, что я пытаюсь сделать:

from django.contrib import admin
from django.contrib.auth.models import User
from userprofile.models import UserProfile


class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('name', 'gender', 'User.email') #user.email creates the error - tried some variations here, but no luck.

admin.site.register(UserProfile, UserProfileAdmin)

Сообщение об ошибке:

ImproperlyConfigured: UserProfileAdmin.list_display[2], 'User.email' не является вызываемым или атрибутом 'UserProfileAdmin' или найденный в модели 'UserProfile'.

В конечном счете я пытаюсь создать администраторское представление, которое имеет первую и фамилию от UserProfile и электронную почту от Пользователя.

33
задан Joe 4 August 2010 в 21:27
поделиться

2 ответа

для отображения электронной почты пользователя необходимо иметь метод в UserProfile или UserProfileAdmin , который возвращает адрес электронной почты

в UserProfile

def user_email(self):
    return self.user.email

или UserProfileAdmin

def user_email(self, instance):
    return instance.user.email

, затем измените свой list_display -

list_display = ('name', 'gender', 'user_email')

Связанные документы: ModelAdmin.list_display

42
ответ дан 27 November 2019 в 18:17
поделиться

Вы можете попробовать использовать InlineModelAdmin для отображения форм User и UserPofile в режиме администратора.

Для отображения информации профиля пользователя в списке изменений вы можете создать новый метод, который делегирует значения из UserProfile модели User .

Например, это должно работать более или менее :)

from django.contrib import admin
from django.contrib.auth.models import User

from my_models import UserProfile

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    fk_name = 'user'

class UserAdmin(admin.ModelAdmin):
    list_display = ['get_userprofile_name', 'email']
    list_select_related = True
    inlines = [
        UserProfileInline,
    ]

    def get_userprofile_name(self, instance):
        # instance is User instance
        return instance.get_profile().name

admin.site.unregister(User)
admin.site.register(User, UserAdmin)
15
ответ дан 27 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: