20

我有一个带有 DateField 的表单。现有的日期值被格式化为如下所示:

2009-10-03

我怎样才能格式化它,使它看起来像这样:

03.10.2009

我找到了一个像这样呈现它的小部件,但验证不允许我输入的值。

4

4 回答 4

37

要以正确格式显示初始字段值,请使用DateInput小部件。要自定义验证,请input_formats使用DateField.

为什么你同时需要formatand input_formats

format- 显示该字段初始值的格式。见这里

input_formats- 用于尝试将字符串转换为有效datetime.date对象的格式列表。见这里

于 2009-10-03T11:29:09.813 回答
13

方法 1:手动格式渲染但日期字段格式验证失败

所以对你来说最好的格式化解决方案是“。”

{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}

得到24.05.2010

我添加了 stringformat:"02d" 以不将25.5.2010作为输出值。

我发布了一个字段的完整代码以获得一个想法:

<input class="form-control" data-inputmask="'mask':'99.99.9999'" data-toggle="masked"  name="{{field.html_name}}" placeholder="{{ field.label }}" {% if field.field.required %}required=""{% endif%} type="text" value="{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}" " >

我主要将这种格式用于更新(模型)表单(UpdateView 类)的现有实例上的日期值。

如果不满足格式,则提交更新表单时此解决方案可能会失败

方法2:(更好)自动化字段值格式+使用设置正确验证

这是通过将自定义本地设置添加到 settings.py 文件来完成的:最重要的部分是DATE_INPUT_FORMATS 元组

..
..
USE_L10N = True
..

DATE_INPUT_FORMATS = (
    '%d.%m.%Y', '%d.%m.%Y', '%d.%m.%y',  # '25.10.2006', '25.10.2006', '25.10.06'
    '%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y',  # '25-10-2006', '25/10/2006', '25/10/06'
    '%d %b %Y',  # '25 Oct 2006', 
    '%d %B %Y',  # '25 October 2006', 
)

DATE_FORMAT = 'j F Y'
TIME_FORMAT = 'H:i'
DATETIME_FORMAT = 'j F Y H:i'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'j F'
SHORT_DATE_FORMAT = 'j N Y'
SHORT_DATETIME_FORMAT = 'j N Y H:i'
FIRST_DAY_OF_WEEK = 1

最重要的:

  1. 日期字段的验证是在插入和更新时使用DATE_INPUT_FORMATS元组中存在的所有格式完成的
  2. 在 updateView 上,日期字段将使用DATE_INPUT_FORMATS 元组的第一种格式呈现(我的意思是使用DATE_INPUT_FORMATS[0] == '%d.%m.%Y')

因此,在这个元组中,第一个元素的选择很重要,因为它定义了更新表单上 datefield 现有值的格式

您也可以使用第一种格式在 UpdateViews 上应用 javascript 验证。

在 django 1.6 和 1.7 上测试过,不知道以前的版本

于 2014-09-23T01:25:03.547 回答
6

子类自定义字段如下:

class CustomDateField(forms.DateField):
  def __init__(self, *args, **kwargs):
    kwargs.setdefault('input_formats', ("%d.%m.%Y",))
    super(CustomDateField, self).__init__(*args, **kwargs)
于 2009-10-03T12:08:26.007 回答
4

您可以通过以下方式在模板中显示日期

{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}
于 2013-10-08T04:47:17.510 回答