Django Admin:如何在同一视图中显示两个不同模型的字段?

Joe*_*Joe 34 django django-models django-admin

我的网站使用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)
Run Code Online (Sandbox Code Playgroud)

错误信息:

NotperlyConfigured:UserProfileAdmin.list_display [2],'User.email'不是'UserProfileAdmin'的可调用或属性,或者在模型'UserProfile'中找到.

最终,我正在尝试创建一个管理视图,其中包含来自UserProfile的姓名和来自User的电子邮件.

Ash*_*hok 42

要显示用户电子邮件,您需要有一个方法UserProfileUserProfileAdmin返回电子邮件

在UserProfile上

def user_email(self):
    return self.user.email
Run Code Online (Sandbox Code Playgroud)

或者在UserProfileAdmin上

def user_email(self, instance):
    return instance.user.email
Run Code Online (Sandbox Code Playgroud)

然后改变你list_display

list_display = ('name', 'gender', 'user_email')
Run Code Online (Sandbox Code Playgroud)

相关文档:ModelAdmin.list_display

  • 很确定你可以使用双下划线表示user__email,而无需定义额外的功能 (2认同)
  • @Hugoagogo 其实你不能。这是 [ticket for it](https://code.djangoproject.com/ticket/5863) 因无法修复而关闭。 (2认同)

Dav*_*cic 15

您可以尝试使用InlineModelAdmin在管理视图中显示User和UserPofile表单.

要在更改列表中显示用户配置文件信息,您可以创建一个将值委派UserProfileUser模型的新方法.

例如,这应该或多或少:)

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)
Run Code Online (Sandbox Code Playgroud)