Django admin - 更改ForeignKey显示文本

rob*_*s85 38 django django-admin

如何在选择字段为ForeignKey时更改select中的显示文本?我不仅需要显示FK的名称,还需要显示它的父名称.

任何人都可以提供线索?

Bot*_*res 53

好吧,如果你想让它只在admin中生效,而不是全局生成,那么你可以创建一个自定义ModelChoiceField子类,在自定义中使用它ModelForm,然后设置相关的管理类来使用你的自定义表单.举例说明,对于Person@Enrique使用的模型有FK :

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)
Run Code Online (Sandbox Code Playgroud)


ale*_*nia 49

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

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)
Run Code Online (Sandbox Code Playgroud)

'user'是您要覆盖的字段的名称.此解决方案为您提供了一个优势:您也可以覆盖查询集(例如,您想要User.objects.filter(username__startswith ='a'))

免责声明:在http://markmail.org/message/t6lp7iqnpzvlt6qp上找到并经过测试的解决方案.


Lu.*_*mec 13

较新版本的django支持此功能,可以使用gettext进行翻译:

models.ForeignKey(ForeignStufg, verbose_name='your text')
Run Code Online (Sandbox Code Playgroud)

  • 这实际上解决了被问到的问题. (13认同)

Enr*_*tín 10

请参阅https://docs.djangoproject.com/en/1.3/ref/models/instances/#unicode

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)
Run Code Online (Sandbox Code Playgroud)

你必须定义你想在模型的unicode方法中显示的内容(ForeignKey在哪里).

问候,


rad*_*tek 5

您也可以admin.ModelAdmin使用实例直接完成此操作label_from_instance。例如:

class InvoiceAdmin(admin.ModelAdmin):

    list_display = ['person', 'id']

    def get_form(self, request, obj=None, **kwargs):
        form = super(InvoiceAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['person'].label_from_instance = lambda obj: "{} {}".format(obj.id, obj.first_name)
        return form


admin.site.register(Invoice, InvoiceAdmin)
Run Code Online (Sandbox Code Playgroud)