如何解决Django Admin内联中外键货币显示为对象ID的问题
Django Admin内联场景下外键下拉显示对象ID的解决方案
方案1:给关联模型定义__str__方法(优先推荐)
该方案全局生效,所有用到Currency模型的展示场景(包括内联下拉)都会自动读取__str__的返回值作为显示内容。
# models.py class Currency(models.Model): code = models.CharField(max_length=3, unique=True) currency = models.CharField(max_length=150, unique=True) # 新增如下方法,可自定义显示格式 def __str__(self): return f"{self.code} - {self.currency}"
注意:修改模型方法后需要重启Django服务,清空浏览器缓存后再验证效果。
方案2:在内联中配置autocomplete_fields(适合货币数据量大的场景)
autocomplete_fields可直接配置在内联类中,无需绑定到主ModelAdmin,使用前需先注册Currency的管理类并配置搜索字段:
# admin.py # 先注册Currency的管理类 @admin.register(Currency) class CurrencyAdmin(admin.ModelAdmin): # 配置autocomplete可搜索的字段 search_fields = ["code", "currency"] class TurnoverInline(admin.TabularInline): model = Turnover extra = 1 classes = ["collapse"] # 在内联中添加autocomplete_fields配置 autocomplete_fields = ["currency"] class SomeAdmin(admin.ModelAdmin): form = SomeForm save_on_top = True inlines = [TurnoverInline]
方案3:仅自定义当前内联的下拉显示内容(无需修改模型)
如果不想全局修改Currency的显示逻辑,仅针对当前内联的下拉做特殊处理,可以重写内联的formfield_for_foreignkey方法:
# admin.py class TurnoverInline(admin.TabularInline): model = Turnover extra = 1 classes = ["collapse"] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "currency": form_field = super().formfield_for_foreignkey(db_field, request, **kwargs) # 自定义每个下拉选项的显示文本 form_field.label_from_instance = lambda obj: f"{obj.code} ({obj.currency})" return form_field return super().formfield_for_foreignkey(db_field, request, **kwargs) class SomeAdmin(admin.ModelAdmin): form = SomeForm save_on_top = True inlines = [TurnoverInline]
内容的提问来源于stack exchange,提问作者piah
相关产品推荐
相关产品推荐

