์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ 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
๊ณ ๋ง์, ํํค.
ํ . ์ ์๊ฐ์ ์ฌ๊ธฐ์ ๋ต์ _์ฌ์ค์ด ์๋๋๋ค_ โ ์์ ๋๋ฝํ๊ณ ์ถ์ง ์๋ค๋ฉด...
_0, _1
๋ถ์๋ฌผ์ ๋ํ ๋
ผ๋ฆฌ๋ django.forms.widgets.MultiWidget.render
์์ ์์ต๋๋ค. ( RangeFilter
๋ $ MultiWidget
ํ์ ํด๋์ค์ธ RangeWidget
๋ฅผ ์ฌ์ฉํ๋ RangeField
๋ฅผ ์ฌ์ฉํฉ๋๋ค.)
์ํ๋ ์ด๋ฆ์ ์ป์ผ๋ ค๋ฉด 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 ์ ํจ๊ป ๋ ๊ฐ์ ๋ ์ง ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ ์ ์ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์์ ์ด๋ฅผ ์ํํ๊ธฐ ์ํด
MultiWidget
๋ฅผ ์๋ธํด๋์ฑํ๋ ์์ ๋๋ค.start
๋ฐend
๋ฅผ ํ๋ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ์ต๋๋ค.