我有一个模型,其中一个字段是ForeignKey,所以我在django admin中看到select,是否可以自定义此选择的标签?
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时,我看到包含部件名称的select标签,我需要看到name_with_model
答案 0 :(得分:9)
如果您的意思是字段标签:
使用以下代码: Django Admin - Overriding the widget of a custom form field
# 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)
如果您指的是选择下拉列表中的标签:
覆盖小部件,如上面的答案所示。
修改强>
fk字段的默认表单字段是模型选择字段。来自docs
模型的 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())