首页 > 解决方案 > Django-filter 'icontains' 没有传递给我的 URL

问题描述

我正在使用 3rd-party Django-filter 为我的博客文章制作搜索栏。

import django_filters
from .models import Post
from django.db import models


class PostFilter(django_filters.FilterSet):
    title = django_filters.CharFilter(field_name='title')

    class Meta:
        model = Post
        fields = {
            'title': ['icontains'],
            }
    #I've tried using filter_overrides to no success
        filter_overrides = {
            models.CharField: {
                'filter_class': django_filters.CharFilter,
                'extra': lambda f: {
                    'lookup_expr': 'icontains',
                    },
                }
            }

我读到 CharFilter 和 TextFilter 默认为精确,但我认为我在下面更改了它。我试过包含和图标。搜索传递到 url,例如:“...blog/?title=foo”。我手动输入了“.../blog/?title__icontains=foo” url,这有效,但是工作 url 不是当我单击搜索按钮时正在传递的 url。任何帮助将不胜感激,谢谢。

*编辑:需要明确的是,过滤器正在工作,但它的工作方式好像是“精确”而不是“包含”。它会找到结果,但前提是我搜索完整标题

标签: pythondjangodjango-filter

解决方案


哈利,

您是否尝试过 django-filter 定义的覆盖?

class ProductFilter(django_filters.FilterSet):

class Meta:
    model = Product
    fields = {
        'name': ['exact'],
        'release_date': ['isnull'],
    }
    filter_overrides = {
        models.CharField: {
            'filter_class': django_filters.CharFilter,
            'extra': lambda f: {
                'lookup_expr': 'icontains',
            },
        },
        models.BooleanField: {
            'filter_class': django_filters.BooleanFilter,
            'extra': lambda f: {
                'widget': forms.CheckboxInput,
            },
        },
    }

推荐阅读