自定义在django admin中选择

时间:2011-03-24 04:41:00

标签: python django django-admin customization

我有一个模型,其中一个字段是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

1 个答案:

答案 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())