【问题标题】:How to change datetime format in Django-filter form?如何更改 Django 过滤器表单中的日期时间格式?
【发布时间】:2018-01-11 07:17:39
【问题描述】:

我正在创建一个包含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,但它会引发:

异常值:无法设置属性

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"]))

【问题讨论】:

    标签: python django django-forms django-filter django-widget


    【解决方案1】:

    一个简单的解决方案是简单地修改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)
    

    从这里,您可以创建一个单独的类,或者为所有 DateTimeFromToRangeFilters 覆盖 field_class

    class CustomDateTimeFromToRangeFilter(django_filters.RangeFilter):
        field_class = CustomDateTimeRangeField
    
    # or 
    
    django_filters.DateTimeFromToRangeFilter.fields_class = CustomDateTimeRangeField
    

    【讨论】:

      【解决方案2】:

      另一种设置方式

          def __init__(self,*args,**kwargs):
              self.form.fields['date__gt'].input_formats = [ '%d-%b-%Y' ]
      

      【讨论】:

        【解决方案3】:

        我正在使用 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
        

        【讨论】:

          猜你喜欢
          • 2021-06-06
          • 2018-07-15
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多