Python Django中DateTimeInput的显示和输入的日期时间格式相同
默认情况下,Django将日期/时间显示为类似于2010年5月13日下午4:01的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
。我还配置了一个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
是进行验证的地方。