如何在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小记

在 django 中表示具有额外属性的 manytomanyfield

Django Admin - 悬停时显示图像

如何在VB6中表示64位整数?

Django admin list_display 在鼠标悬停时显示全文

在 Katai 中表示 Double 值