Django-filter: 范围过滤器查询参数的 URL 中的自定义名称?

创建于 2015-09-20  ·  3评论  ·  资料来源: carltongibson/django-filter

我想知道是否可以重命名 URL 中用于查询参数的字段名称。
目前

class TransactionFilter(django_filters.FilterSet):
    created = django_filters.DateFromToRangeFilter()
    class Meta:
        model = models.Transaction
        fields = ('created', )

请求看起来像

/api/transaction?created_0=2015-01-01&created_1=2015-01-02

这工作正常,但不是很直观。 我想知道是否有任何方法可以为范围字段使用不同的名称,例如

/api/transaction?created_since=2015-01-01&created_until=2015-01-02

谢谢,哈基。

最有用的评论

这是一个子类化MultiWidget的例子; 我使用startend作为字段名称:

from django.utils.safestring import mark_safe

from django_filters.fields import DateRangeField
from django_filters.filters import RangeFilter
from django_filters.widgets import RangeWidget


class StartEndRangeWidget(RangeWidget):
    """
    A range widget that uses 'start' and 'end' instead of '0' and '1'.
    """

    attr_names = ('start', 'end')

    def render(self, name, value, attrs=None):
        if self.is_localized:
            for widget in self.widgets:
                widget.is_localized = self.is_localized

        # value is a list of values, each corresponding to a widget
        # in self.widgets.
        if not isinstance(value, list):
            value = self.decompress(value)

        output = []
        final_attrs = self.build_attrs(attrs)
        id_ = final_attrs.get('id')

        for i, widget in enumerate(self.widgets):
            try:
                widget_value = value[i]
            except IndexError:
                widget_value = None

            if id_:
                final_attrs = dict(final_attrs,
                                   id='%s_%s' % (id_, self.attr_names[i]))

            output.append(widget.render(name + '_%s' % self.attr_names[i],
                                        widget_value, final_attrs))

        return mark_safe(self.format_output(output))

    def value_from_datadict(self, data, files, name):
        return [widget.value_from_datadict(data, files,
                                           name + '_%s' % self.attr_names[i])
                for i, widget in enumerate(self.widgets)]


class StartEndDateRangeField(DateRangeField):
    """
    A DateRangeField that uses 'start' and 'end'.
    """

    widget = StartEndRangeWidget


class StartEndDateFromToRangeFilter(RangeFilter):
    """
    A RangeFilter that uses 'start' and 'end'.
    """

    field_class = StartEndDateRangeField

所有3条评论

嗯。 我认为这里的答案_不是真的_——除非你想弄脏你的手......

_0, _1附件的逻辑来自django.forms.widgets.MultiWidget.render 。 ( RangeFilter使用RangeField ,它使用RangeWidget这是MultiWidget的子类。)

你可以自由地实现render来获得你想要的命名。 你也需要一个匹配的value_from_datadict

这是一个子类化MultiWidget的例子; 我使用startend作为字段名称:

from django.utils.safestring import mark_safe

from django_filters.fields import DateRangeField
from django_filters.filters import RangeFilter
from django_filters.widgets import RangeWidget


class StartEndRangeWidget(RangeWidget):
    """
    A range widget that uses 'start' and 'end' instead of '0' and '1'.
    """

    attr_names = ('start', 'end')

    def render(self, name, value, attrs=None):
        if self.is_localized:
            for widget in self.widgets:
                widget.is_localized = self.is_localized

        # value is a list of values, each corresponding to a widget
        # in self.widgets.
        if not isinstance(value, list):
            value = self.decompress(value)

        output = []
        final_attrs = self.build_attrs(attrs)
        id_ = final_attrs.get('id')

        for i, widget in enumerate(self.widgets):
            try:
                widget_value = value[i]
            except IndexError:
                widget_value = None

            if id_:
                final_attrs = dict(final_attrs,
                                   id='%s_%s' % (id_, self.attr_names[i]))

            output.append(widget.render(name + '_%s' % self.attr_names[i],
                                        widget_value, final_attrs))

        return mark_safe(self.format_output(output))

    def value_from_datadict(self, data, files, name):
        return [widget.value_from_datadict(data, files,
                                           name + '_%s' % self.attr_names[i])
                for i, widget in enumerate(self.widgets)]


class StartEndDateRangeField(DateRangeField):
    """
    A DateRangeField that uses 'start' and 'end'.
    """

    widget = StartEndRangeWidget


class StartEndDateFromToRangeFilter(RangeFilter):
    """
    A RangeFilter that uses 'start' and 'end'.
    """

    field_class = StartEndDateRangeField

@beaugunderson ,值得一提的是,在某些情况下(比如我的),使用 lt / gt 的两个日期字段更容易。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Alexx-G picture Alexx-G  ·  4评论

chromakey picture chromakey  ·  5评论

lalzada picture lalzada  ·  3评论

techdragon picture techdragon  ·  5评论

gsvr picture gsvr  ·  3评论