Django_filters - 未显示带有 ForeignKey 的 MultipleChoiceFilter

Posted

技术标签:

【中文标题】Django_filters - 未显示带有 ForeignKey 的 MultipleChoiceFilter【英文标题】:Django_filters - MultipleChoiceFilter with ForeignKey not shown 【发布时间】:2022-01-20 02:26:35 【问题描述】:

我正在尝试使用多个过滤器过滤数字产品。其中包括功能模型。因此,用户选择一个类别,然后与该类别相关,可以按其功能过滤现有产品 模型.py

class Platform(models.Model):
    name = models.CharField(max_length=200, verbose_name='Name')
    thumbnail = models.ImageField(upload_to='DigitalProduct/thumbnails')
    category = models.ForeignKey(Category, on_delete=models.CASCADE)


class Category(models.Model):
    category = models.CharField(max_length=200)
    filter_functions = models.ManyToManyField(Functionality, verbose_name='Filter by')


class Functionality(models.Model):
    functionality = models.CharField(max_length=200)

我安装了 django-filter v2.4.0 并尝试添加过滤器。 过滤器.py

...
class PlatformFilter(django_filters.FilterSet):
    func = django_filters.MultipleChoiceFilter(field_name='category', conjoined=True)

在我的views.py 函数中,我通过queryset=Platform.objects.filter(category=category) 来获取正确的数字产品,它工作正常,但类别值未显示在MultipleChoiceField 中。

views.py

def platform_list(request, slug):
    category = Category.objects.get(slug=slug)
    # filter query
    f = PlatformFilter(request.GET, queryset=Platform.objects.filter(category=category))
    return render(request, 'core/platform-list.html', 
        'category': category,
        'filter': f
    )

到目前为止,我可以看到 MultipleChoiceField,但没有显示任何值。

我尝试将字段名称更改为 field_name='category.category',但我得到一个 [invalid name]。

我错过了什么吗?

【问题讨论】:

请展示您的PlatformFilter 的更多部分,特别是Meta 课程,同时展示您的观点... 确定添加views.py。我还没有将 Meta 类设置为 PlatformFilter Platform的型号是什么?你没有在你的问题中显示它。 对不起,平台是DigitalProduct。我的名字错了.. 【参考方案1】:

通常,如果有人想使用MultipleChoiceFilter,他们必须提供您不提供的选项,因此不会显示任何选项。

此外,由于categoryForeignKey,那么您应该使用ModelMultipleChoiceFilter [django-filter docs] 而不是MultipleChoiceFilter

class PlatformFilter(django_filters.FilterSet):
    func = django_filters.ModelMultipleChoiceFilter(field_name='category', queryset=Category.objects.all(), conjoined=True)

【讨论】:

不错,适合。但是如何从我选择的类别中获取 filter_functions 呢?我想按 filter_functions 过滤。你知道吗?

以上是关于Django_filters - 未显示带有 ForeignKey 的 MultipleChoiceFilter的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django_Filters 过滤时间

如何内联输出 django_filters.RangeFilter 文本框?

使用 django_filters 过滤多个参数

如何使用 django_filters.DateFilter?

使用 django_filters 创建 OR 过滤器

django_filters结合drf