Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中DateTimeInput的显示和输入的日期时间格式相同_Python_Django_Django Forms_Python Datetime - Fatal编程技术网

Python Django中DateTimeInput的显示和输入的日期时间格式相同

Python Django中DateTimeInput的显示和输入的日期时间格式相同,python,django,django-forms,python-datetime,Python,Django,Django Forms,Python Datetime,默认情况下,Django将日期/时间显示为类似于2010年5月13日下午4:01的。我还配置了一个jQuery(我使用了dateFormat:“MM d,yy”,timeFormat:“h:MM tt”,并且我修改了JavaScript源代码以输出a.m.和p.m.,而不是AM和PM)以相同的格式显示日期/时间 但是表单验证(默认情况下)采用 DATETIME_INPUT_FORMATS = ( '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:5

默认情况下,Django将日期/时间显示为类似于2010年5月13日下午4:01的
。我还配置了一个jQuery(我使用了
dateFormat:“MM d,yy”,timeFormat:“h:MM tt”
,并且我修改了JavaScript源代码以输出
a.m.
p.m.
,而不是
AM
PM
)以相同的格式显示日期/时间

但是表单验证(默认情况下)采用

DATETIME_INPUT_FORMATS = (
    '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
    '%Y-%m-%d %H:%M:%S.%f',  # '2006-10-25 14:30:59.000200'
    '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
    '%Y-%m-%d',              # '2006-10-25'
    '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
    '%m/%d/%Y %H:%M:%S.%f',  # '10/25/2006 14:30:59.000200'
    '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
    '%m/%d/%Y',              # '10/25/2006'
    '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
    '%m/%d/%y %H:%M:%S.%f',  # '10/25/06 14:30:59.000200'
    '%m/%d/%y %H:%M',        # '10/25/06 14:30'
    '%m/%d/%y',              # '10/25/06'
)
我试图添加
'%B%d,%Y,%I:%M%p'
,但我不确定
%p
是否占
a.M.
p.M.
(注意字母后面的句点)。下面是一个链接,指向上的Python文档

你们是怎么做到的?您是坚持Django的默认(丑陋的)日期/时间格式,还是在检查
表单之前以某种方式转换时间。是否有效()
(在JavaScript或Python中)


为@Thomas Orozco编辑

我编写了一个名为
CustomDateTimeField
的新表单字段:

class CustomDateTimeField(forms.DateTimeField):
    def strptime(self, value, format):
        return datetime.datetime.strptime(value.replace("a.m.", "AM").replace("p.m.", "PM"), "%B %d, %Y, %I:%M %p")
但是,我的表单使用
ModelForm
,它在
类Meta
下有一个动态的
字段。我的意思是:

def order_edit(request, pk):
    order = Order.objects.get(pk=pk)

    if foo:
        include_fields = (
            'fa_date',
            'sa_date',
        )
    else:
        include_fields = (
            'sa_date',
        )

    class OrderDetailForm(forms.ModelForm):
        class Meta:
            model = Order
            fields = include_fields

    if request.method == 'POST':
        form = OrderDetailForm(data=request.POST, instance=order)

其中,
Order.sa_date
Order.fa_date
都是
型号.datetime字段
。我想我只能对
ModelForm
widgets
使用
DateTimeInput
。那么,我如何告诉表单使用
CustomDateTimeField
作为
OrderEditForm
?我是否需要通过
\uuu init\uuuu
添加额外的参数,并手动重新定义字段,如
self.fields['fa\u date']=CustomDateTimeField(…)

呈现的内容取决于所使用的区域设置。我不确定是否有任何语言环境提供了
a.m.
/
p.m.

但是,最简单的方法是为表单字段提供自己的验证函数。如果这是一个一次性字段,只需覆盖表单的
clean\u fieldname(self)
方法(其中fieldname是日期时间字段的名称)。看

如果要重复使用此字段,请使用验证逻辑创建一个自定义字段,并在需要自定义验证时导入和使用它。您还可以自定义小部件以呈现任何jquery选择器。

初始答案 如果希望字段接受特定格式,则更简单的解决方案是实现自己的表单字段,这通常非常简单,尤其是在这里,因为Django方便地为您提供了一个高效的基类

实际上,查看
DateTimeField
,您可以看到它继承自
BaseTemporalField
。因此,您只需将
BaseTemporalField
子类化,并实现
strtime
方法,使其接受您的输入格式

所说的输入格式应该通过
input\u formats
变量传递给您的实例,尽管如果您愿意编写更多的代码,这不是必需的

您还可以浏览
DateTimeField
DateField
的代码,以获得一些灵感

编辑 实际上,你只需要重新定义它们。但是,在您的情况下,您不能使用条件块来执行此操作(在类定义中不能有
if
语句!)。因此,您有两种解决方案:

class SAOrderDetailForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ('sa_date',)
    sa_date = CustomDateTimeField()

class FASAOrderDetailForm(SAOrderDetailForm): #Inheritance matters!
    class Meta:
        model = Order
        fields = ('sa_date','fa_date')
    fa_date = CustomDateTimeField()

if foo:
    FormClass = FASAOrderDetailForm
else:
    FormClass = SAOrderDetailForm

或者,您可以使用表单类的动态创建,但这显然超出了这个问题的范围,因此我将留给您解释如何这样做

我试图修改
请求。POST
通过执行
。replace('a.m.,'AM')
,但
QueryDict
是不可变的,Django不允许。我相信如果您的输入没有首先通过字段验证,
clean_fieldname
将不会起作用,是吗?
clean_fieldname
是进行验证的地方。