我可以在 Django Admin 中显示二级以上的相关字段吗?
Can I display second level up related fields in Django Admin?
假设我有一个如下所示的三层模型,其中 posts 在类别中,然后在类别中。我想让管理面板中的帖子页面显示每个 post 所属的子类别和类别。理想情况下,让我同时过滤两者。到目前为止,我只能让管理面板建立一个关系级别。所以我可以按 sub_category 显示和过滤,但是当我添加类别时出现错误。
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'.
您需要在管理员 class 上添加一个方法,returns 每个 post 的类别然后在 list_display
中引用它
class PostsAdmin(admin.ModelAdmin):
list_display = ('name','id','sub_category', 'category')
def category(self, obj):
return obj.sub_category.category.name
您也可以将此方法添加到 post 模型而不是模型管理员
假设我有一个如下所示的三层模型,其中 posts 在类别中,然后在类别中。我想让管理面板中的帖子页面显示每个 post 所属的子类别和类别。理想情况下,让我同时过滤两者。到目前为止,我只能让管理面板建立一个关系级别。所以我可以按 sub_category 显示和过滤,但是当我添加类别时出现错误。
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'.
您需要在管理员 class 上添加一个方法,returns 每个 post 的类别然后在 list_display
class PostsAdmin(admin.ModelAdmin):
list_display = ('name','id','sub_category', 'category')
def category(self, obj):
return obj.sub_category.category.name
您也可以将此方法添加到 post 模型而不是模型管理员