Django Admin中的欧洲日期输入

8 投票
6 回答
6114 浏览
提问于 2025-04-15 11:49

Django有一些选项,比如DATE_FORMAT和DATE_TIME_FORMAT,可以让我们选择在查看日期时使用什么格式。不过,似乎在Django后台编辑或添加日期时,无法更改输入格式。

后台默认的日期格式是:YYYY-MM-DD

但如果能用:DD-MM-YYYY,那就太好了。

这个在国际化(i18n)中有集成吗?有没有办法在不自定义模型的情况下更改这个格式?

6 个回答

5

我修改了一些设置,让它关闭了本地化功能,并且明确设置了日期格式:

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

你也可以设置日期输入格式。

11

现在有一种官方的方法可以做到这一点,这要感谢 Django 6483号问题 的关闭和 Django 1.2 的发布。

如果你的 USE_L10N 设置为 False,那么你需要在你的 settings.py 文件中指定 DATE_INPUT_FORMATSDATETIME_INPUT_FORMATS。以下是我根据默认设置转换后使用的配置:

#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

举个例子,我的 LANGUAGE_CODE 设置为 en-au,我的网站叫 golf,而我的 FORMAT_MODULE_PATH 设置为 golf.formats,所以我的目录结构看起来是这样的:

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

DATE_INPUT_FORMATSDATETIME_INPUT_FORMATS 的设置则放在 formats.py 文件中,而不是 settings.py

2

根据这个想法,我创建了一个新的数据库字段类 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="")

在我的情况下,这在管理界面中显示得很好,但在 ModelForm 中也很可能会这样(我还没试过)。

我的 Django 版本是:

>>> import django
>>> django.get_version()
u'1.1 alpha 1 SVN-10105'

撰写回答