如何在Django Admin中更改ForeignKey显示文本?

55 投票
9 回答
49592 浏览
提问于 2025-04-16 22:19

我想知道怎么在一个 <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)

撰写回答