8

Django 有一个 DATE_FORMAT 和一个 DATE_TIME_FORMAT 选项,允许我们在查看日期时选择使用哪种格式,但显然不允许我在 Django Admin 中编辑或添加时更改日期的输入格式。

管理员的默认值为:YYYY-MM-DD

但是使用起来会很棒:DD-MM-YYYY

这在任何情况下都集成在 i18n 中吗?这可以在没有自定义模型的情况下更改吗?

4

6 回答 6

10

自从Django 票 6483关闭和 Django 1.2 发布以来,现在有一种官方方法可以做到这一点。

如果您已USE_L10N设置为False,您应该做的是DATE_INPUT_FORMATSDATETIME_INPUT_FORMATS您的settings.py. 以下是我用于此的设置,基于转换默认值:

#dd/mm/yyyy and dd/mm/yy date & datetime input field settings
DATE_INPUT_FORMATS = ('%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y', '%d %b %Y',
                      '%d %b, %Y', '%d %b %Y', '%d %b, %Y', '%d %B, %Y',
                      '%d %B %Y')
DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M:%S', '%d/%m/%Y %H:%M', '%d/%m/%Y',
                          '%d/%m/%y %H:%M:%S', '%d/%m/%y %H:%M', '%d/%m/%y',
                          '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d')

如果您已USE_L10N设置为True,那么您将需要使用FORMAT_MODULE_PATH

例如,myLANGUAGE_CODE设置为en-au,我的站点名为golf,myFORMAT_MODULE_PATH设置为golf.formats,所以我的目录结构如下所示:

golf/
    settings.py
    ...
    formats/
        __init__.py
        en/
            __init__.py
            formats.py

并且DATE_INPUT_FORMATSandDATETIME_INPUT_FORMATS设置在formats.py而不是settings.py.

于 2012-01-14T05:03:44.030 回答
5

我修改了设置,使其禁用 l10n 并明确设置日期格式:

USE_L10N = False
DATE_FORMAT = 'd-m-Y'
DATETIME_FORMAT = 'd-m-Y H:i'

您也可以设置 DATE_INPUT_FORMATS。

于 2011-12-22T12:42:20.030 回答
2

您现在必须自己执行此操作,但使用设置 DateField 的 input_formats 参数的自定义表单字段类非常容易。这应该这样做:

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

请注意 input_formats 是一个列表,因此您可以指定多种可能性,它会在解析用户输入时按顺序尝试它们。

于 2009-05-26T18:28:37.333 回答
2

基于这个想法,我创建了新的 db.fields 类 EuDateField:

mydbfields.py

from django import forms
from django.forms.fields import DEFAULT_DATE_INPUT_FORMATS
from django.db import models

class EuDateFormField(forms.DateField):
    def __init__(self, *args, **kwargs):
        kwargs.update({'input_formats': ("%d.%m.%Y",)+DEFAULT_DATE_INPUT_FORMATS})
        super(EuDateFormField, self).__init__(*args, **kwargs)

class EuDateField(models.DateField):
    def formfield(self, **kwargs):
        kwargs.update({'form_class': EuDateFormField})
        return super(EuDateField, self).formfield(**kwargs)

请注意,它首先将我的格式(例如 31.12.2007)添加到现有的“标准”django 格式中。

用法:

from mydbfields import EuDateField
class Person(models.Model):
    ...
    birthday   = EuDateField("Birthday", null=True, blank=True, help_text="")

在我的情况下,这在 admin 中表现良好,但很可能在 ModelForm 中也可以(还没有尝试过)。

我的 Django 版本是:

>>> import django
>>> django.get_version()
u'1.1 alpha 1 SVN-10105'
于 2009-09-17T08:59:25.687 回答
1

据我了解,似乎尚不支持此功能,所以是的,您现在必须做一些自定义工作。

于 2009-05-26T06:19:51.453 回答
0

请注意不要将其写为字符串,而应将其写为元组。例如:

DATE_INPUT_FORMATS = ('%d.%m.%Y',) 

如果您只想在表单中使用一种有效的日期书写方式。

于 2013-05-23T22:10:38.200 回答