Django admin后台通过外键关联表显示role_name字段的实现方法
实现方案
以下是两种常用的实现方式,可根据需求选择:
方法1:修改Roles模型的__str__方法(全局生效,最简单)
Django Admin展示外键字段时,默认会调用关联模型的__str__方法,修改该方法即可让所有外键引用位置默认显示角色名称:
修改models.py
class Roles(models.Model): portal_name = models.CharField(_('Portal name'), max_length=100) role_name = models.CharField(_('Role_name'), max_length=50) # 新增__str__方法 def __str__(self): return self.role_name # 其余模型代码保持不变 class RolePermission(models.Model): module_name = models.CharField(_('Module name'), max_length=100) module_delete = models.BooleanField(default=False, help_text="Delete module. Default false, can't delete") module_edit = models.BooleanField(default=False, help_text="Edit module. Default false, can't edit") module_create = models.BooleanField(default=False, help_text="Create module. Default false, can't create") module_submit = models.BooleanField(default=False, help_text="Submit module, Default false.") module_role_id = models.ForeignKey('Roles', on_delete=models.CASCADE)
修改admin.py
把list_display中的module_role_id_id替换为外键字段名module_role_id即可:
@admin.register(RolePermission) class RolePermissionAdmin(admin.ModelAdmin): list_display = ('module_name', 'module_role_id', 'module_delete', 'module_edit', 'module_create', 'module_submit') # 可选优化:加select_related避免N+1查询问题 list_select_related = ('module_role_id',)
方法2:Admin自定义列(仅当前列表页生效,更灵活)
如果不想修改模型全局的展示逻辑,仅需要在RolePermission的列表页单独显示角色名,可直接在Admin类中新增自定义字段:
修改admin.py
@admin.register(RolePermission) class RolePermissionAdmin(admin.ModelAdmin): # 把原来的module_role_id_id替换为自定义的字段名role_name list_display = ('module_name', 'role_name', 'module_delete', 'module_edit', 'module_create', 'module_submit') # 可选优化:关联查询减少数据库请求 list_select_related = ('module_role_id',) # 自定义字段逻辑 def role_name(self, obj): # 返回关联Roles表的role_name字段 return obj.module_role_id.role_name # 配置列表页该列的表头名称 role_name.short_description = '角色名称'
内容的提问来源于stack exchange,提问作者Denis Maksiura
相关产品推荐
相关产品推荐

