如何在Django Admin中表示这种两级深层关系?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Django Admin中表示这种两级深层关系?相关的知识,希望对你有一定的参考价值。
场景是这样的,
我有三个型号:
Category, Subcategory and Posts
他们之间的关系是这样的。
class Category(models.Model):
cat=models.CharField(max_length=10)
def __str__(self):
return self.cat
class Subcategory(models.Model):
cat=models.ForeignKey(Category,on_delete=models.CASCADE,null=True)
subcat=models.CharField(max_length=10)
def __str__(self):
return self.subcat
class Posts(models.Model):
title=models.CharField(max_length=15)
subcat=models.ForeignKey(Subcategory,on_delete=models.CASCADE,null=True)
def __str__(self):
return self.title
一切都好。我已经从管理面板添加了类别,并且还添加了类别和子类别。但是,我也希望从管理面板添加帖子。现在,问题是当我从管理面板添加帖子并选择子类别时,它会列出所有类别中的所有子类别(这很明显,因为我在帖子模型中有子类别字段)。我不想要这种行为,我希望在保存时只从某个类别获取子类别。
例如:我有一个类别Django及其子类别ORM,VIEWS。另外,我还有其他类别的其他子类别,例如C ++。所以,如果我发布帖子并且我希望它来自Django类别,它应该只在管理面板的建议中列出ORM和VIEWS。
我愿意在模型中进行修改,比如需要额外的字段或类似的东西。任何线索赞赏。
答案
您如何选择每个帖子条目将收集子类别以供选择的类别? Posts
模型没有与Category
相关的字段。
如果选择caterory的逻辑是每个Posts
条目的外部,你可以使用这个片段来实现这个(来自here)
@admin.register(Posts)
class PostsAdmin(admin.ModelAdmin):
# (...)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "subcat":
kwargs["queryset"] = Subcategory.objects.filter(cat__cat=['Django'])
return super().formfield_for_foreignkey(db_field, request, **kwargs)
但是(也许这就是你真正想要的),如果你希望每个帖子的子类别按其特定类别进行过滤,你可以先在其模型上添加一个类别字段:
class Posts(models.Model):
title=models.CharField(max_length=15)
cat=models.ForeignKey(Category,on_delete=models.CASCADE,null=True)
subcat=models.ForeignKey(Subcategory,on_delete=models.CASCADE,null=True)
def __str__(self):
return self.title
然后,您可以使用自定义表单(来自here)过滤que queryset:
class PostsAdminForm(forms.ModelForm):
class Meta:
model = Posts
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# use the following for python 2 instead
# super(PostsAdminForm, self).__init__(*args, **kwargs)
self.fields['subcat'].queryset = Subcategory.objects.filter(
cat__id=self.instance.cat.id)
@admin.register(Posts)
class PostsAdmin(admin.ModelAdmin):
# (...)
form = PostsAdminForm
以上是关于如何在Django Admin中表示这种两级深层关系?的主要内容,如果未能解决你的问题,请参考以下文章
在 django 中表示具有额外属性的 manytomanyfield