Django-filter: أسماء مخصصة في URL لمعلمات الاستعلام لمرشح النطاق؟

تم إنشاؤها على ٢٠ سبتمبر ٢٠١٥  ·  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 للقيام بذلك ؛ استخدمت start و end كأسماء الحقول:

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 للقيام بذلك ؛ استخدمت start و end كأسماء الحقول:

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 التقييمات