Django FormSet中模型ForeignKey类型Choice字段显示对象而非名称如何解决
解决方案
你遇到的下拉选项显示Position对象的问题,本质是Django默认调用模型的__str__方法作为实例的文本表示,你可以通过两种方式解决:
方案1:全局修改Position模型的字符串表示(最推荐)
直接给Position模型添加__str__方法,修改后所有用到Position实例的场景(包括表单下拉、admin后台等)都会自动显示name字段值,无需调整其他代码。
修改后的models.py对应代码:
class Position(models.Model): name = models.CharField(max_length=20) short = models.CharField(max_length=2) def __str__(self): # 也可以自定义返回格式,比如 return f"{self.short} - {self.name}" 同时显示短名和全名 return self.name class Players(models.Model): name = models.CharField(max_length=200) positionId = models.ForeignKey(Position, on_delete=models.CASCADE, null=True, blank=True)
方案2:仅修改当前表单的下拉选项文本
如果不想全局修改Position的默认显示,只针对这个表单的下拉做定制,可以在表单类中自定义positionId字段的选项文本:
修改后的forms.py对应代码:
from django.forms import ModelChoiceField from .models import Position, Players class CompositionForm(ModelForm): # 自定义外键字段的选项文本 positionId = ModelChoiceField( queryset=Position.objects.all(), label_from_instance=lambda obj: obj.name, # 如果你需要保留字段原有属性比如允许为空,可以加上以下参数 required=False, empty_label="未分配位置" ) class Meta: model = Players fields = ("positionId", ... many more ... )
两种方案任选其一即可,修改后刷新页面就能看到下拉选项已经替换为Position的name字段值。
内容的提问来源于stack exchange,提问作者NotGoodProgrammer
相关产品推荐
相关产品推荐

