在Django admin中如何在通用外键的下拉列表中显示详细名称

时间:2012-01-19 23:58:31

标签: django django-admin

我的模型定义为:

class Feature(models.Model):
    content_type = models.ForeignKey(ContentType)
    user = models.ForeignKey(User, unique = True)
    object_id = models.PositiveIntegerField()
    description = models.TextField("Description", blank=False)
    content_object = generic.GenericForeignKey('content_type', 'object_id')

在django管理站点中,content_type的下拉列表显示所有表,但是作为其定义的名称,而不是详细的名称。如何更改此项以显示漂亮的名称而不是编码名称?

1 个答案:

答案 0 :(得分:3)

在不更改ContentType模型的情况下,您可以通过自定义用于Feature模型的ModelAdmin来完成此操作。具体来说,您可以覆盖formfield_for_foreignkey方法,该方法定义用于模型上每个外键的字段。

您还必须定义自定义的ModelChoiceField,它会覆盖下拉列表使用的常规标签。

在您的admin.py中:

from django.contrib import admin
from django.forms import ModelChoiceField
from myproject.myapp.models import Feature

class CustomContentTypeChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "Pretty name for #%d" % obj.id

class FeatureAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "content_type":
            return CustomContentTypeChoiceField(**kwargs)
        return super(FeatureAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

admin.site.register(Feature, FeatureAdmin)

参考文献:

自定义管理表单字段:https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

ModelChoiceFields:https://docs.djangoproject.com/en/1.3/ref/forms/fields/#modelchoicefield