如何在Django Admin中显示Post关联的Trainer创建者邮箱属性
Django Admin 正确显示Post创建者邮箱的配置方法
问题根因
你当前遇到的展示错误核心有两个原因:
- 新建Post时没有自动将登录的培训师账号绑定到
trainer字段,默认使用了ID=1的超级管理员作为创建者,所以所有Post都显示管理员邮箱 - PostAdmin的
fields配置未包含trainer字段,即便设置了只读也无法在详情页展示创建者信息
修改步骤
1. 修正模型冗余代码(可选)
UserTrainer模型中定义的get_email方法存在语法错误,你没有用到该方法可以直接删除,需要保留的话修改为:
# models.py UserTrainer类内 def get_email(self): # 直接返回当前实例的email即可,不需要调用object属性 return self.email
2. 修改PostAdmin配置
重写save_model方法实现创建Post时自动绑定当前登录用户,同时把trainer加入展示字段:
# admin.py PostAdmin类修改为以下内容 @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ('article', 'slug','trainer') list_display_links = ('article',) # 新增trainer到字段配置,详情页才会展示 fields = ('article', 'slug', 'keywords', 'text', 'trainer') readonly_fields = ('trainer',) def save_model(self, request, obj, form, change): # 仅在新建Post时赋值创建者,修改时不改动原有创建者 if not change: obj.trainer = request.user super().save_model(request, obj, form, change)
注意:请确认你已经在项目
settings.py中配置了自定义用户模型:AUTH_USER_MODEL = "你的blog子应用名.UserTrainer",否则request.user可能不是UserTrainer实例,导致赋值错误。
效果说明
修改后培训师登录账号创建Post时,系统会自动将当前登录的培训师账号赋值给trainer字段,你的UserTrainer模型已经定义了__str__方法返回邮箱,所以Admin列表页和详情页的trainer字段都会直接展示对应用户的邮箱。历史已创建的Post可以手动在数据库或Admin后台修改trainer字段值更新展示。
内容的提问来源于stack exchange,提问作者Bohdan Sizomin
相关产品推荐
相关产品推荐

