AutoCompleteFilter自我获取外键滤波器查询所有父母

发布于 2025-01-18 12:04:03 字数 2178 浏览 3 评论 0原文

我不想按父类别对类别进行过滤,我使用一个模型,对于父类别,我将其链接到自身。
模型:

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey(
        "self", on_delete=models.CASCADE, null=True, blank=True, related_name="childs"
    )
    description = models.TextField(null=True, blank=True)
    is_adult = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

admin.py中:

class ParentCategoryFilter(AutocompleteFilter):
    title = "By parent category"
    field_name = "parent"
    autocomplete_url = "parent-category-autocomplete"
    is_placeholder_title = True


class CategoryAdmin(admin.ModelAdmin):
    search_fields = ["name"]
    autocomplete_fields = ["parent"]
    fieldsets = (
        (
            _("Details"),
            {
                "fields": (
                    "name",
                    "parent",
                    "description",
                ),
            },
        ),
    )
    list_display = (
        "name",
        "parent",
    )
    list_filter = [ParentCategoryFilter]


admin.site.register(Category, CategoryAdmin)

和views.py,其中定义了ParentCategoryFilter

class ParentCategoryAutocompleteView(autocomplete.Select2QuerySetView):
    permissions = [
        "CategoryView",
    ]

    def get_queryset(self):
        qs = Category.objects.filter(parent__isnull=True)
        if self.q:
            qs = qs.filter(Q(name__istartswith=self.q))
        return qs

视图的url是:

urlpatterns = [
    url(
        "^/autocomplete",
        
staff_permission_required(ParentCategoryAutocompleteView.permissions)(
            ParentCategoryAutocompleteView.as_view()
        ),
        name="parent-category-autocomplete",
    ),

我遇到的问题是在过滤器中我得到孩子的类别名称。我不知道它有什么问题。 输入图片此处描述

I wan't to make a filter on categories by parent category, I use a model and for parent category I linked it to itself.
the model:

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey(
        "self", on_delete=models.CASCADE, null=True, blank=True, related_name="childs"
    )
    description = models.TextField(null=True, blank=True)
    is_adult = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

in admin.py :

class ParentCategoryFilter(AutocompleteFilter):
    title = "By parent category"
    field_name = "parent"
    autocomplete_url = "parent-category-autocomplete"
    is_placeholder_title = True


class CategoryAdmin(admin.ModelAdmin):
    search_fields = ["name"]
    autocomplete_fields = ["parent"]
    fieldsets = (
        (
            _("Details"),
            {
                "fields": (
                    "name",
                    "parent",
                    "description",
                ),
            },
        ),
    )
    list_display = (
        "name",
        "parent",
    )
    list_filter = [ParentCategoryFilter]


admin.site.register(Category, CategoryAdmin)

and the views.py where ParentCategoryFilter is defined:

class ParentCategoryAutocompleteView(autocomplete.Select2QuerySetView):
    permissions = [
        "CategoryView",
    ]

    def get_queryset(self):
        qs = Category.objects.filter(parent__isnull=True)
        if self.q:
            qs = qs.filter(Q(name__istartswith=self.q))
        return qs

The url to the views is:

urlpatterns = [
    url(
        "^/autocomplete",
        
staff_permission_required(ParentCategoryAutocompleteView.permissions)(
            ParentCategoryAutocompleteView.as_view()
        ),
        name="parent-category-autocomplete",
    ),

the problem I get is that in the filter I get the child's categories name. I don't know what the problem with it.
enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水晶透心 2025-01-25 12:04:04

如果您没有在其他地方使用、调用或表示类别模型对象默认名称。一项简单的修改是向模型添加默认字符串名称。

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey(
        "self", on_delete=models.CASCADE, null=True, blank=True, related_name="childs"
    )
    description = models.TextField(null=True, blank=True)
    is_adult = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        if self.parent != None:
            return self.parent.name
        else:
            return self.name

这是一个快速而肮脏的解决方案。如果您无法使用此解决方案,我将进一步研究此问题。

If your not using, calling on , or representing the category model object default name anywhere else. One simple modification would be to add a default string name to the model.

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey(
        "self", on_delete=models.CASCADE, null=True, blank=True, related_name="childs"
    )
    description = models.TextField(null=True, blank=True)
    is_adult = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        if self.parent != None:
            return self.parent.name
        else:
            return self.name

This is a quick and dirty solution. If you are not able to use this solution I will look into this further.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文