TaggitFilter
与常规的ModelMultipleChoiceFilter
有何不同?
另外,我敢肯定,我们可以添加lookup_expr
支持,在这里通过简单地查找加盟字段名。
使用ModelMultipleChoiceFilter
,URL 必须为field_name=tag1&field_name=tag2
,但可能存在大量标签,导致 URL 很长。 例如,对于可以共享的 URL 来说并不理想。
标签由 django-taggit 使用一组规则处理,允许传递包含所有标签的单个字符串。
无论如何, lookup_expr
中的ModelMultipleChoiceFilter
肯定会有所帮助!
快速浏览一下,您应该能够使用 Taggit 的TagsField
。 这将为您提供他们的 csv 解析行为。
class TagsFilter(CharFilter):
field_class = taggit.forms.TagsField
def __init__(self, *args, **kwargs):
kwargs.setdefault('lookup_expr', 'in')
class MyFilterSet(FilterSet):
tags = TagsFilter(name='tags__name')
class Meta:
model = MyModel
GET http://localhost/api/my-model?tags=a,b,c,d
这里需要注意的是,这使用了in
查找,这不是您正在寻找的不区分大小写的解决方案。
我或多或少不想为 Django Taggit 添加特定的过滤器,尽管它可能是一个很棒的包。
最终创建项目级过滤器并不难。 一个体面的要点会有很长的路要走。 (谷歌非常适合那些人。)
如果出现 A+ 拉取请求,很高兴看到它,但除此之外,我将关闭它,因为它超出了范围。
好,可以。 对ModelMultipleChoiceFilter
lookup_expr
支持怎么样?
@stantond 很高兴看到 PR。 _给我看 Cödz_ 😀
我希望我能 - 不幸的是,我不是一个熟练的开发人员,而是一个笨手笨脚的 PM!
+1
最新库的工作示例:
from taggit.forms import TagField
from django_filters.views import FilterView
class TagFilter(django_filters.CharFilter):
field_class = TagField
def __init__(self, *args, **kwargs):
kwargs.setdefault('lookup_expr', 'in')
super().__init__(*args, **kwargs)
class MyFilter(django_filters.FilterSet):
tags = TagFilter(field_name='tags__name')
class Meta:
model = MyModel
使用标签的slug
字段而不是name
字段不区分大小写。 默认情况下,Taggit 将 slugs 小写。
请注意,如果我们希望支持通过包含一个或多个空格的单个标签进行过滤,我们可以使用自定义字段扩展https://github.com/carltongibson/django-filter/issues/460#issuecomment -507218839 中的解决方案。
from django import forms
from django.utils.translation import gettext as _
from taggit.utils import parse_tags
class TagField(forms.CharField):
def clean(self, value):
value = super().clean(value)
if "," not in value and '"' not in value and value:
return [value]
try:
return parse_tags(value)
except ValueError:
raise forms.ValidationError(
_("Please provide a comma-separated list of tags.")
)
代码是从taggit/forms.py
提取的。
最有用的评论
最新库的工作示例: