Skip to main content
 首页 » 编程设计

python之如何更改 Django 过滤器形式的日期时间格式

2024年10月01日34shihaiming

我正在创建一个包含datetime 范围选择的过滤器。我希望用户能够以这种格式输入日期: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 而不是两个输入。

那么问题来了,如何指定格式(不改变widget)?

我试图在 __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) 

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

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