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

时间:2012-05-27 14:21:38

标签: python django django-forms python-datetime

默认情况下,Django会将日期/时间显示为May 13th, 2010, 4:01 p.m.。我还配置了一个jQuery calendar plugin(我使用dateFormat: "MM d, yy", timeFormat: "h:mm tt"并修改了JavaScript源代码以输出a.m.p.m.而不是AM和{{1 }})以相同的格式显示日期/时间。

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

的形式
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'是否会占%pa.m.(注意字母后面的句点)。以下是date/time formats上的Python文档链接。

你们是怎么做到的?您是否坚持使用Django的默认(丑陋)日期/时间格式,或者在检查p.m.之前以某种方式转换时间(无论是使用JavaScript还是Python)?


@Thomas Orozco的

编辑

我写了一个名为form.is_valid()的新表单字段:

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下具有动态fields。这就是我的意思:

class 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。我认为我只能models.DateTimeField DateTimeInput ModelForm使用widgets。那么我如何告诉表单CustomDateTimeField使用OrderEditForm?我是否需要通过__init__添加额外的参数并手动重新定义self.fields['fa_date'] = CustomDateTimeField(...)等字段?

2 个答案:

答案 0 :(得分:2)

初步答案

如果你希望你的字段接受特定的格式,更简单的解决方案是实现你自己的表单字段,这通常很容易,特别是在这里,因为Django可以方便地为你提供一个有效的基类。

确实,查看DateTimeField的{​​{3}},您可以看到它继承自BaseTemporalField。因此,您只需要子类BaseTemporalField并实现strptime方法,以便它接受您的输入格式。

应该通过input_formats变量将所述输入格式传递给您的实例,但如果您愿意再编写更多代码,则不需要这样做。

您还可以浏览DateTimeFieldDateField的代码,以获得灵感。

修改

你实际上django source:你只需要重新定义它们。在您的情况下,您无法使用条件块(在类定义中不能有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

或者,你可以使用动态创建表单类,但这远远超出了这个问题的范围,所以我将留下can override the fields of a ModelForm来解释如何执行此操作。

答案 1 :(得分:1)

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

但是,最简单的方法是为表单字段提供自己的验证功能。如果这是一次性字段,只需覆盖表单的clean_fieldname(self)方法(其中 fieldname 是日期时间字段的名称)。请参阅cleaning a specific field attribute

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

相关问题