Django Admin,修改/自定义manytomany字段的选择框中的名称

时间:2017-12-15 06:04:56

标签: django django-admin

我有2个型号分类和产品。类别对自己有一个FK,而对公司有一个FK。

class Product(Meta):
    categories = models.ManyToManyField(Category, related_name='products')

 class Category(SEO, MetaData):
    parent = models.ForeignKey('self', blank=True, null=True, verbose_name='parent category', on_delete=models.CASCADE)

在产品创建/编辑页面的Django Admin中,我需要选择父类别。

此刻只是一个长选择框,名称为Categories。我想介绍category-subcategory的所有路径。

例如:

Now: Category A Name
Need: Category Parent Name :: SubCategory Parent Name :: Category A Name

我不想修改def __str__因为在其他地方也使用过。

1 个答案:

答案 0 :(得分:1)

您可以使用这样的自定义ModelForm

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = '__all__'  # It's actually best to list the fields out as per Two Scoops of Django

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['categories'].label_from_instance = \
            lambda obj: obj.enumerated_path

enumerated_path替换为Product模型的属性/方法的名称。不要忘记在ModelAdmin添加form = ProductForm时使用该表单。