Django admin在名称中显示__str__值

时间:2017-08-17 17:44:52

标签: django django-models

我有很多这样的领域:

class Retailer(models.Model):
    name = models.CharField(max_length=100, db_index=True)
    city_gps = models.ManyToManyField(City, blank=True, related_name='retailers', db_index=True)

    def __str__(self):
        retailer_city = ""
        if self.city_gps:
            retailer_city = self.city_gps.all().first().name

        return slugify(self.name) + slugify(retailer_city)

我希望管理员显示名称和所有相关城市的组合。但是,当我将管理员设置为显示此字段时:

class RetailerAdmin(admin.ModelAdmin):
    search_fields = ['name']
    list_display = ['name', 'city_gps', 'icon_tag', 'logo_tag', 'header_tag']

我收到错误:

  

:( admin.E109)的值   'list_display [1]'不能是ManyToManyField。

那么,我该如何解决这个问题呢?有没有办法在管理员中显示__str__方法的价值?

1 个答案:

答案 0 :(得分:1)

正如the docs for list_display in Django所说:

  不支持

ManyToManyField个字段,因为这需要为表中的每一行执行单独的SQL语句。如果您想要这样做,请为您的模型提供自定义方法,并将该方法的名称添加到list_display。 (有关list_display中自定义方法的更多信息,请参见下文。)

因此,您可以直接在models.py中使用admin.py或(我认为更多explicit方式)定义此自定义方法

class RetailerAdmin(admin.ModelAdmin):
    search_fields = ['name']
    list_display = ['name', 'icon_tag', 'logo_tag', 'header_tag', 'retailer_city']

    def retailer_city(self, obj):
        city_gps = obj.city_gps
        retailer_city = city_gps.all().first().name if city_gps else ''

        return slugify(obj.name) + slugify(retailer_city)

请注意,retailer_city中添加了list_display