首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-filters:使用不同分隔符的BaseInFilter

Django-filters:使用不同分隔符的BaseInFilter
EN

Stack Overflow用户
提问于 2020-10-14 13:27:25
回答 1查看 191关注 0票数 0

我希望能够在django过滤器中拆分文本,而不是使用逗号。

我目前正在使用django-filter和一个BaseInFilter来允许在一个模型中搜索多个整数值。这个过滤器根据逗号分隔值,并且我似乎不能覆盖分割值的函数。很可能是我误解了这种分裂发生在哪里。

我曾尝试在类BaseCSVWidget中重写此方法

代码语言:javascript
复制
def value_from_datadict(self, data, files, name):
    value = super().value_from_datadict(data, files, name)
    if value is not None:
        if value == '':  # empty value should parse as an empty list
            return []
        return value.split(',')
    return None

通过使用不同的分隔符将其放入我的过滤器中:

代码语言:javascript
复制
class PidnInFilter(BaseInFilter, NumberFilter):
    def value_from_datadict(self, data, files, name):
        value = super().value_from_datadict(data, files, name)

        if value is not None:
            if value == '':  # empty value should parse as an empty list
                return []
            return value.split(' ')
        return None

我还尝试创建我自己的窗口小部件类并覆盖它:

代码语言:javascript
复制
from django_filters.widgets import BaseCSVWidget

class MyWidget(BaseCSVWidget):
    def value_from_datadict(self, data, files, name):
        print('value_from_datadict reached')
        print(data)
        value = super().value_from_datadict(data, files, name)
        print(value)

        if value is not None:
            if value == '':  # empty value should parse as an empty list
                return []
            return value.split(' ')
        return None


class PidnInFilter(BaseInFilter, NumberFilter):
    base_widget_class = MyWidget

两者都不能在空格上拆分。最好,我希望使用\n作为分隔符,或者能够根据上下文选择分隔符。但是,我遗漏了一些很明显的事情...

EN

回答 1

Stack Overflow用户

发布于 2020-10-15 16:26:50

你的问题是类是组合的,而不是继承的:你试图在过滤器上设置小部件,但过滤器定义了一个字段,而字段定义了小部件:

代码语言:javascript
复制
MyFilter
    base_field_class = MyField

    MyField
        base_widget_class = MyWidget

因此,在MyFilter上设置base_widget_class不会做任何事情。这应该会让你走上正确的方向(未经测试):

代码语言:javascript
复制
from django_filters.fields import BaseCSVField
from django_filters.widgets import BaseCSVWidget
from django_filters.filters import BaseInFilter, NumberFilter


class PidWidget(BaseCSVWidget):
    separator = " "

    def value_from_datadict(self, data, files, name):
        value = super().value_from_datadict(data, files, name)

        if value is not None:
            if value == "":  # empty value should parse as an empty list
                return []
            return value.split(self.separator)
        return None


class PidField(BaseCSVField):
    base_widget_class = PidWidget


class PidFilter(BaseInFilter, NumberFilter):
    base_field_class = PidField
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64347142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档