Django:如何格式化 DateField 的日期表示形式?

发布于 2024-08-06 02:19:59 字数 165 浏览 8 评论 0原文

我有一个带有日期字段的表单。现有日期值的格式如下所示:

2009-10-03

我如何格式化它,使其看起来像这样:

03.10.2009

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

I have a form with a DateField. The existing date value is formatted to render like this:

2009-10-03

How can I format that so that it look like this:

03.10.2009

I found a widget which renders it like this, but validation doesn't allow the values I enter then.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

携君以终年 2024-08-13 02:19:59

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

为什么同时需要 formatinput_formats

format - 该字段初始值的显示格式。请参阅此处

input_formats - 用于尝试将字符串转换为有效的 datetime.date 对象的格式列表。请参阅此处

To display initial field value properly formatted, use DateInput widget. To customize validation, use input_formats keyword argument of DateField.

Why do you need both format and input_formats?

format - The format in which this field’s initial value will be displayed. See here.

input_formats - A list of formats used to attempt to convert a string to a valid datetime.date object. See here.

━╋う一瞬間旳綻放 2024-08-13 02:19:59

方法 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')

所以选择第一个元素在此元组中很重要,因为它定义了更新表单上日期字段现有值的格式。

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

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

Method 1 : manual format rendering but fails datefield format validation

So best formating solution for you would be "."

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

to get 24.05.2010

I added stringformat:"02d" to not get 25.5.2010 as output value.

I post the full code of a field to get an idea :

<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}}" " >

I mainly used this formatting for the date value on an existing instance of an update (model) form (UpdateView class).

This solution may fail when submitting the update form if it will not satisfy the format

Method 2 : (Better) automatize field value formatting + correct validation using settings

It's done by adding custom local settings to settings.py file :
The most important part is the DATE_INPUT_FORMATS tuple

..
..
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

The most important:

  1. The validation of datefields is done on insert and update with all formats present in DATE_INPUT_FORMATS tuple
  2. On updateView, the date field will be rendered using the first format of DATE_INPUT_FORMATS tuple (i mean using DATE_INPUT_FORMATS[0] == '%d.%m.%Y')

So the choice of the first element is important in this tuple as it defines the formating of existing value of datefield on update forms

You can apply javascript validation on UpdateViews using this first format too.

Tested on django 1.6 and 1.7 , don't know for previous versions

内心激荡 2024-08-13 02:19:59

子类化自定义字段如下:

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

Subclass custom field like this:

class CustomDateField(forms.DateField):
  def __init__(self, *args, **kwargs):
    kwargs.setdefault('input_formats', ("%d.%m.%Y",))
    super(CustomDateField, self).__init__(*args, **kwargs)
幻想少年梦 2024-08-13 02:19:59

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

{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}

You can show date in template by means of

{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文