如何更改 Django 过滤器形式的日期时间格式?
How to change datetime format in Django-filter form?
我正在创建一个包含 datetime
范围选择的 filter
。我希望用户能够以这种格式输入日期:24.08.2017 17:09
从文档中,可以指定一个小部件(来自 django.forms
)并且小部件具有属性 input_formats
。
所以这将是一个解决方案:
datetime_range = django_filters.DateTimeFromToRangeFilter(method='datetime',
label=u'Čas od do',widget=forms.widgets.DateTimeInput(format="%D.%m.%Y %H:%M:%S")
问题是它使用 DateTimeFromToRangeFilter
,它使用两个 DateTimeInput
字段。因此,如果我指定小部件,它会呈现一个 DateTimeInput
而不是两个输入。
所以问题是,如何指定格式(不更改小部件)?
我试图在 __init__(...)
中指定 input_formats
但它引发了:
Exception Value: can't set attribute
def __init__(self,*args,**kwargs):
self.base_filters['datetime_range'].field = (forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]),forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]))
一个简单的解决方案是简单地修改 DATETIME_INPUT_FORMATS
设置。
或者,您可以根据现有 DateTimeRangeField.
创建自定义字段
class CustomDateTimeRangeField(django_filters.RangeField):
def __init__(self, *args, **kwargs):
fields = (
forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]),
forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]),
)
super(CustomDateTimeRangeField, self).__init__(fields, *args, **kwargs)
从这里,您可以创建一个单独的 class,或者覆盖所有 DateTimeFromToRangeFilter
的 field_class
。
class CustomDateTimeFromToRangeFilter(django_filters.RangeFilter):
field_class = CustomDateTimeRangeField
# or
django_filters.DateTimeFromToRangeFilter.fields_class = CustomDateTimeRangeField
另一种设置方式
def __init__(self,*args,**kwargs):
self.form.fields['date__gt'].input_formats = [ '%d-%b-%Y' ]
我正在使用 django-filter==2.0.0。我发现似乎没有兑现 Django DATETIME_INPUT_FORMATS
设置。我基本上使用了接受的答案,但我发现我还需要指定小部件属性:
class ISODateTimeRangeField(django_filters.filters.RangeField):
widget = django_filters.filters.DateTimeRangeField.widget
def __init__(self, *args, **kwargs):
fields = (
DateTimeField(input_formats=['%Y-%m-%dT%H:%M:%S.%fZ']),
DateTimeField(input_formats=['%Y-%m-%dT%H:%M:%S.%fZ']),
)
super(ISODateTimeRangeField, self).__init__(fields, *args, **kwargs)
django_filters.DateTimeFromToRangeFilter.field_class = ISODateTimeRangeField
我正在创建一个包含 datetime
范围选择的 filter
。我希望用户能够以这种格式输入日期:24.08.2017 17:09
从文档中,可以指定一个小部件(来自 django.forms
)并且小部件具有属性 input_formats
。
所以这将是一个解决方案:
datetime_range = django_filters.DateTimeFromToRangeFilter(method='datetime',
label=u'Čas od do',widget=forms.widgets.DateTimeInput(format="%D.%m.%Y %H:%M:%S")
问题是它使用 DateTimeFromToRangeFilter
,它使用两个 DateTimeInput
字段。因此,如果我指定小部件,它会呈现一个 DateTimeInput
而不是两个输入。
所以问题是,如何指定格式(不更改小部件)?
我试图在 __init__(...)
中指定 input_formats
但它引发了:
Exception Value: can't set attribute
def __init__(self,*args,**kwargs):
self.base_filters['datetime_range'].field = (forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]),forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]))
一个简单的解决方案是简单地修改 DATETIME_INPUT_FORMATS
设置。
或者,您可以根据现有 DateTimeRangeField.
创建自定义字段class CustomDateTimeRangeField(django_filters.RangeField):
def __init__(self, *args, **kwargs):
fields = (
forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]),
forms.DateTimeField(input_formats=["%D.%m.%Y %H:%M"]),
)
super(CustomDateTimeRangeField, self).__init__(fields, *args, **kwargs)
从这里,您可以创建一个单独的 class,或者覆盖所有 DateTimeFromToRangeFilter
的 field_class
。
class CustomDateTimeFromToRangeFilter(django_filters.RangeFilter):
field_class = CustomDateTimeRangeField
# or
django_filters.DateTimeFromToRangeFilter.fields_class = CustomDateTimeRangeField
另一种设置方式
def __init__(self,*args,**kwargs):
self.form.fields['date__gt'].input_formats = [ '%d-%b-%Y' ]
我正在使用 django-filter==2.0.0。我发现似乎没有兑现 Django DATETIME_INPUT_FORMATS
设置。我基本上使用了接受的答案,但我发现我还需要指定小部件属性:
class ISODateTimeRangeField(django_filters.filters.RangeField):
widget = django_filters.filters.DateTimeRangeField.widget
def __init__(self, *args, **kwargs):
fields = (
DateTimeField(input_formats=['%Y-%m-%dT%H:%M:%S.%fZ']),
DateTimeField(input_formats=['%Y-%m-%dT%H:%M:%S.%fZ']),
)
super(ISODateTimeRangeField, self).__init__(fields, *args, **kwargs)
django_filters.DateTimeFromToRangeFilter.field_class = ISODateTimeRangeField