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

新手上路,请多包涵

如何在选择 <select> 字段时更改 ForeignKey 字段中的显示文本?

我不仅需要显示 ForeignKey 的名称,还需要显示其父级的名称。

原文由 robos85 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 721
2 个回答

如果你希望它只在管理员中生效,而不是全局生效,那么你可以创建一个自定义 ModelChoiceField 子类,在自定义中使用它 ModelForm 然后将相关的管理类设置为使用您定制的表格。使用一个示例,该示例具有 @Enrique 使用的 Person 模型的外键:

 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)

原文由 Botond Béres 发布,翻译遵循 CC BY-SA 4.0 许可协议

这样做的另一种方法(在更改查询集时很有用):

 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 上找到并经过测试的解决方案。

原文由 alekwisnia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题