如何在Django Admin中更改ForeignKey显示文本?
我想知道怎么在一个 <select>
下拉框中,选择某个外键(ForeignKey
)时,改变显示的文字。
我需要不仅显示外键的名字,还要显示它的父级名字。
9 个回答
18
更新版本的Django支持这个功能,可以通过gettext来进行翻译:
models.ForeignKey(ForeignStufg, verbose_name='your text')
62
还有一种方法可以做到这一点(当你需要更改查询集时很有用):
class MyForm(forms.Form):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['user'].queryset = User.objects.all()
self.fields['user'].label_from_instance = lambda obj: "%s %s" % (obj.last_name, obj.first_name)
'user'
是你想要覆盖的字段名称。这种方法有一个好处:你也可以覆盖查询集(比如说,你想要 User.objects.filter(username__startswith='a')
)。
免责声明:这个解决方案来自于 http://markmail.org/message/t6lp7iqnpzvlt6qp,并经过测试。
64
如果你想让这个设置只在管理员界面生效,而不是在全局范围内生效,你可以创建一个自定义的 ModelChoiceField
子类,然后在一个自定义的 ModelForm
中使用它,最后把相关的管理员类设置为使用你自定义的表单。这里有一个例子,它包含一个指向 Person
模型的外键,正好是 @Enrique 提到的:
class Invoice(models.Model):
person = models.ForeignKey(Person)
....
class InvoiceAdmin(admin.ModelAdmin):
form = MyInvoiceAdminForm
class MyInvoiceAdminForm(forms.ModelForm):
person = CustomModelChoiceField(queryset=Person.objects.all())
class Meta:
model = Invoice
class CustomModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "%s %s" % (obj.first_name, obj.last_name)