自定义在django admin中选择

And*_*sov 5 python django customization django-admin

我有一个模型,其中一个字段是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)
Run Code Online (Sandbox Code Playgroud)

当我添加新的SmallPart时,我看到带有部件名称的select标签,我需要看到name_with_model

DTi*_*ing 9

如果你的意思是字段标签:

使用以下代码: 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'
Run Code Online (Sandbox Code Playgroud)

然后,在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)
Run Code Online (Sandbox Code Playgroud)

如果您的意思是选择下拉列表中的标签:

像上面的答案中一样覆盖小部件.

编辑:

fk字段的默认表单字段是模型选择字段.来自docs

将调用模型的unicode方法来生成对象的字符串表示,以便在字段的选择中使用; 提供自定义表示,子类ModelChoiceField和覆盖label_from_instance.此方法将接收模型对象,并应返回适合表示它的字符串.例如:

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.name_with_model()
Run Code Online (Sandbox Code Playgroud)

然后:

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