Django Admin中编辑Refbook时如何显示关联的只读版本列表
两种实现方案
方案一:用TabularInline展示只读版本表格
这种方式保留表格结构,能清晰展示每个版本的版本号和日期,实现步骤如下:
- 在
admin.py中定义关联模型的Inline类:
from django.contrib import admin from .models import Refbook, VersionRefbook class VersionRefbookInline(admin.TabularInline): model = VersionRefbook # 设置所有字段为只读 readonly_fields = ['version', 'date'] # 禁止添加新版本(可选,按需设置) extra = 0 # 不允许删除版本(可选) can_delete = False
- 在
RefbookAdmin中注册这个Inline:
@admin.register(Refbook) class RefbookAdmin(admin.ModelAdmin): list_display = ['id', 'code', 'name'] inlines = [VersionRefbookInline]
编辑Refbook实例时,页面下方会出现一个只读表格,列出该Refbook的所有关联版本。
方案二:用逗号分隔文本展示版本列表
如果想要更紧凑的展示形式,可以把版本信息合并成一行逗号分隔的文本,有两种实现方式:
方式1:在模型中定义方法
修改Refbook模型,添加生成版本字符串的方法:
class Refbook(models.Model): code = models.CharField(max_length=100, unique=True) name = models.CharField(max_length=300) description = models.TextField() def get_versions(self): # 格式化为「版本号 (日期)」的形式,用逗号分隔 return ', '.join([f"{v.version} ({v.date})" for v in self.versions.all()]) # 设置admin中显示的字段名称 get_versions.short_description = '可用版本'
然后在RefbookAdmin中把这个方法加入只读字段:
@admin.register(Refbook) class RefbookAdmin(admin.ModelAdmin): list_display = ['id', 'code', 'name'] readonly_fields = ['get_versions'] # 也可以用fieldsets分组展示 fieldsets = ( ('基本信息', {'fields': ('code', 'name', 'description')}), ('版本信息', {'fields': ('get_versions',)}), )
方式2:在Admin中定义自定义方法(无需修改模型)
如果不想改动模型,直接在RefbookAdmin中定义方法即可:
@admin.register(Refbook) class RefbookAdmin(admin.ModelAdmin): list_display = ['id', 'code', 'name'] readonly_fields = ['display_versions'] def display_versions(self, obj): return ', '.join([f"{v.version} ({v.date})" for v in obj.versions.all()]) display_versions.short_description = '可用版本'
关于你之前的问题
你之前在模型中写了get_versions但没在admin中显示,原因是没有在RefbookAdmin的readonly_fields或fields中声明这个方法,Django Admin只会展示你明确指定的字段或方法。
内容的提问来源于stack exchange,提问作者Артур
相关产品推荐
相关产品推荐

