【问题标题】:Django: How to format a DateField's date representation?Django:如何格式化 DateField 的日期表示?
【发布时间】:2010-12-03 13:34:28
【问题描述】:

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

2009-10-03

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

03.10.2009

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

【问题讨论】:

  • 这么多的声誉已经浪费在这个上了。 :(

标签: django localization formatting format datefield


【解决方案1】:

要以正确格式显示初始字段值,请使用DateInput 小部件。要自定义验证,请使用 DateFieldinput_formats 关键字参数。

为什么需要formatinput_formats

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

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

【讨论】:

  • 感谢这个工作......现在看起来像这样:my_date = forms.DateField(initial=date.today(), widget=forms.DateInput(format = '%d.%m.% Y'), input_formats=('%d.%m.%Y',))
  • 注意:我相信这只适用于 Django 1.1 及更高版本。我正在使用 1.0。
  • 为什么 format 和 input_formats 都需要?
  • 在原始问题之后这么多年看到这个的人的注释。小心这个:initial=date.today()。通过使用括号,您实际上是在立即调用该函数,这意味着该字段的默认日期将是执行代码的日期(无论何时启动 WSGI 服务器)。我怀疑这不是您想要的,如果是这样,您应该删除括号,以便 Django 在实例化新模型时仅调用 date.today
  • @radtek,format 属性用于渲染输入中的日期,而 input_formats 用于定义要接受的有效格式
【解决方案2】:

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

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

{{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 上测试,不知道以前的版本

【讨论】:

  • 请注意,DATE_INPUT_FORMATSglobal_settings 文件中的列表,而不是元组。
【解决方案3】:

子类自定义字段如下:

class CustomDateField(forms.DateField):
  def __init__(self, *args, **kwargs):
    kwargs.setdefault('input_formats', ("%d.%m.%Y",))
    super(CustomDateField, self).__init__(*args, **kwargs)

【讨论】:

    【解决方案4】:

    您可以通过

    在模板中显示日期
    {{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}
    

    【讨论】:

    • 对不起,我没有专心
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多