如何在Django自定义用户配置文件中显示姓氏
解决Django Admin显示用户姓氏而非用户名的问题
嘿,我来帮你搞定这个需求!你现在需要在Admin后台的UserProfile列表里展示用户的姓氏,而不是默认显示的用户名,对吧?咱们可以通过给user_action类添加自定义字段的方式来实现,具体步骤如下:
步骤1:添加自定义方法获取姓氏
在你的user_action类中,添加一个自定义方法,用来从关联的User模型中提取姓氏。如果用户没有填写姓氏,还可以做个 fallback 显示用户名,避免空值:
def get_user_last_name(self, obj): # 如果姓氏为空,显示用户名作为备选 return obj.user.last_name or obj.user.username # 设置这个字段在Admin列表里的显示名称 get_user_last_name.short_description = '用户姓氏' # 允许按姓氏排序(可选) get_user_last_name.admin_order_field = 'user__last_name'
步骤2:更新list_display字段
把原来list_display里的'user'替换成咱们刚定义的'get_user_last_name',这样列表里就会显示姓氏而不是默认的用户名了。
修改后的完整Admin代码
from django.contrib import admin from commonpage.models import UserProfile, PositionTable # 自定义动作(确保你已定义这两个动作函数,这里补充示例实现) def make_user_active(modeladmin, request, queryset): queryset.update(useractive=True) make_user_active.short_description = "标记选中用户为激活状态" def make_user_deactive(modeladmin, request, queryset): queryset.update(useractive=False) make_user_deactive.short_description = "标记选中用户为非激活状态" class user_action(admin.ModelAdmin): # 替换user为自定义的姓氏字段 list_display = ['get_user_last_name', 'useractive','position','team_name','preferd_shift'] ordering = ['id'] list_filter = ('useractive','position','team_name','preferd_shift') list_editable = ['position','team_name','preferd_shift'] actions = [make_user_active, make_user_deactive] # 添加自定义方法获取用户姓氏 def get_user_last_name(self, obj): return obj.user.last_name or obj.user.username get_user_last_name.short_description = '用户姓氏' get_user_last_name.admin_order_field = 'user__last_name' # 注册模型 admin.site.register(UserProfile, user_action) admin.site.register(PositionTable)
额外说明
- 如果你想同时显示用户名和姓氏,只需要把
get_user_last_name加到list_display里,保留原来的'user'即可,比如:list_display = ['user', 'get_user_last_name', 'useractive', ...] admin_order_field属性是用来让这个自定义字段支持排序的,如果你不需要排序功能,可以去掉这一行。
内容的提问来源于stack exchange,提问作者Mohamed Naveen
相关产品推荐
相关产品推荐

