自定义Django Admin中的选择框

8 投票
1 回答
17079 浏览
提问于 2025-04-16 14:18

我有一个模型,其中有一个字段是外键,所以在Django的管理后台我能看到一个下拉选择框。请问这个选择框的标签可以自定义吗?



class Model(models.Model):
    name = models.CharField()
    def __unicode__(self):
         return self.name

class Part(models.Model):
    name = models.CharField()
    parent =  model.ForeignKey(Model)
    def __unicode__(self):
         return self.name
    def name_with_model(self):
         return self.name + ' ' + parent.name

class SmallPart(models.Model):
    name = models.CharField()
    parent =  model.ForeignKey(Part)

当我添加新的SmallPart时,我看到的下拉框里是零件的名字,我希望能看到的是带有模型名称的名字。

1 个回答

12

如果你是指字段标签:

可以参考以下代码:

Django Admin - 自定义表单字段的控件覆盖

# forms.py

from django import forms
from django.contrib import admin

class ProductAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProductAdminForm, self).__init__(*args, **kwargs)
        self.fields['tags'].label = 'Custom Label'

然后,在你的 ModelAdmin 对象中,你需要指定表单:

from django.contrib import admin
from models import Product
from forms import ProductAdminForm

class ProductAdmin(admin.ModelAdmin):
    form = ProductAdminForm

admin.site.register(Product, ProductAdmin)

如果你是指下拉选择框中的标签:

可以像上面的回答那样覆盖控件。

补充:

外键字段的默认表单字段是模型选择字段。你可以在 文档 中找到相关信息。

模型的unicode方法会被调用,用来生成对象的字符串表示,以便在字段的选择中使用;如果想要自定义表示,可以创建 ModelChoiceField 的子类,并重写 label_from_instance 方法。这个方法会接收一个模型对象,并应该返回一个适合表示它的字符串。例如:

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.name_with_model()

然后:

class SmallPartAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(SmallPartAdminForm, self).__init__(*args, **kwargs)
        self.fields['parent'] = MyModelChoiceField(queryset=Part.objects.all())

撰写回答