Могу ли я отобразить связанные поля второго уровня вверх в Django Admin? - PullRequest
0 голосов
/ 11 января 2020

Допустим, у меня есть трехуровневая модель, как показано ниже, где сообщения находятся в категориях, а затем в категориях. Мне бы хотелось, чтобы на панели «Администраторы» отображалась страница «Сообщения» с указанием подкатегории и категории, к которой относится каждое сообщение. И в идеале позвольте мне фильтровать оба. Пока что я могу заставить только панель администратора работать на одном уровне отношений. Поэтому я могу отображать и фильтровать по подкатегории, но когда я добавляю категорию, я получаю сообщение об ошибке.

models.py:

class Category(models.Model):
    name=models.CharField(max_length=10)
    def __str__(self):
         return self.name

class Subcategory(models.Model):
    category=models.ForeignKey(Category,on_delete=models.CASCADE,null=True)
    name=models.CharField(max_length=10)
    def __str__(self):
         return self.name

class Posts(models.Model):
     title=models.CharField(max_length=15)
     sub_category=models.ForeignKey(Subcategory,on_delete=models.CASCADE,null=True)
     def __str__(self): 
         return self.title

Admin.py:

class PostsAdmin(admin.ModelAdmin):
    ordering = ('name',)
    list_display = ('name','id','sub_category', 'sub_category__category.name', )
    exclude = ('sort',)
    list_filter = ['sub_category','sub_category__category']
    search_fields = ['name']
admin.site.register(Posts, PostsAdmin)

Ошибка примерно такая:

<class 'journal.admin.PostsAdmin'>: (admin.E108) The value of 'list_display[4]' refers to 'sub_category__category', which is not a callable, an attribute of 'PostsAdmin', or an attribute or method on 'journal.Admin'.

1 Ответ

1 голос
/ 11 января 2020

Вам необходимо добавить метод в свой класс администратора, который возвращает категорию для каждого сообщения, а затем сослаться на это в list_display

class PostsAdmin(admin.ModelAdmin):
    list_display = ('name','id','sub_category', 'category')

    def category(self, obj):
        return obj.sub_category.category.name

Вы также можете добавить этот метод в модель публикации, а не в модель. admin

...