自定义Django Admin中的选择框
我有一个模型,其中有一个字段是外键,所以在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())