我的网站使用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)
错误讯息:
NotperlyConfigured:UserProfileAdmin.list_display [2],'User.email'不是'UserProfileAdmin'的可调用或属性,或者在模型'UserProfile'中找到。
最终,我正在尝试创建一个第一个& UserProfile的姓氏和用户的电子邮件。
答案 0 :(得分:41)
要显示用户电子邮件,您需要在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')
答案 1 :(得分:15)
您可以尝试使用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)
答案 2 :(得分:0)
使用Ashoks的最佳答案我制作了片段,简化了大量字段的过程
class ColumnViewer(object):
pass
column_list = ('name', 'surname', )
for col in column_list:
setattr(ColumnViewer, col, lambda s,i : getattr(i, col))
@admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin, ColumnViewer):
list_display = column_list