Django 过滤器:错误:使用 LinkWidget 时输入值列表

问题描述

也许你们中的一个可以帮助我解决“Django-filter”。在我的模板中,当我想使用 LinkWidget 时,会显示“输入值列表”错误。 当我将 LinkWidget 与 django_filters.AllValuesMultipleFilter 一起使用时,它会在我的模板中显示单词“all”和字段类别的 ID

当我将它与 Django 表单小部件“widget=forms.CheckBoxSelectMultiple)”一起使用时,我就能够过滤数据。

我的代码有什么问题?
谢谢。
Krgds。

  # file: filters.py
from portfolio.models import Project,Category,Client
import django_filters
from django_filters.widgets import LinkWidget

from django import forms

# error: Enter a list of values.
class ProjectFilter(django_filters.FilterSet):
   categories = django_filters.ModelMultipleChoiceFilter(queryset=Category.objects.all(),# this a ManyToManyField 
       widget=django_filters.widgets.LinkWidget)

   class Meta:
           model = Project
           fields = ['categories' ]


# shows "all" and the ID’s of te field categories
class ProjectFilter(django_filters.FilterSet):
   categories = django_filters.AllValuesMultipleFilter(widget=django_filters.widgets.LinkWidget)  

   class Meta:
       model = Project
       fields = ['categories' ]

解决方法

LinkWidget 会将过滤后的结果作为无序列表和 html 中的列表项列出。 即:

<ul id="id_categories">
<li><a href="?categories=">All</a></li>
<li><a class="selected" href="?categories=1">Offices</a></li>
<li><a href="?categories=2"> Residential </a></li>
</ul>

要实现这一点,您可以使用“django_filters.filters.ModelChoiceFilter”。尽管要过滤的字段是 ManyToManyField。

根据文档:

ModelMultipleChoiceFilter¶

与 MultipleChoiceFilter 类似,但它适用于相关模型,默认用于 ManyToManyField。

模型选择过滤器¶

与 ChoiceFilter 类似,只是它适用于相关模型,默认用于 ForeignKey。

#filters.py
class ProjectFilter(django_filters.FilterSet):
    categories = django_filters.filters.ModelChoiceFilter(
        required=False,queryset=Category.objects.all(),widget=django_filters.widgets.LinkWidget
    )
    
    class Meta:
        model = Project
        fields = ['categories' ]