Django Admin中的欧洲日期输入
Django有一些选项,比如DATE_FORMAT和DATE_TIME_FORMAT,可以让我们选择在查看日期时使用什么格式。不过,似乎在Django后台编辑或添加日期时,无法更改输入格式。
后台默认的日期格式是:YYYY-MM-DD
但如果能用:DD-MM-YYYY,那就太好了。
这个在国际化(i18n)中有集成吗?有没有办法在不自定义模型的情况下更改这个格式?
6 个回答
我修改了一些设置,让它关闭了本地化功能,并且明确设置了日期格式:
USE_L10N = False
DATE_FORMAT = 'd-m-Y'
DATETIME_FORMAT = 'd-m-Y H:i'
你也可以设置日期输入格式。
现在有一种官方的方法可以做到这一点,这要感谢 Django 6483号问题 的关闭和 Django 1.2 的发布。
如果你的 USE_L10N
设置为 False
,那么你需要在你的 settings.py
文件中指定 DATE_INPUT_FORMATS
和 DATETIME_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_FORMATS
和 DATETIME_INPUT_FORMATS
的设置则放在 formats.py
文件中,而不是 settings.py
。
根据这个想法,我创建了一个新的数据库字段类 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'