DjangoにはDATE_FORMATおよびDATE_TIME_FORMATオプションがあり、日付を表示するときに使用する形式を選択できますが、Django Adminで編集または追加するときに日付の入力形式を変更できないようです.
管理者のデフォルトは次のとおりです: YYYY-MM-DD
しかし、使用するのは素晴らしいでしょう: DD-MM-YYYY
これはいずれにしても i18n に統合されていますか? これはカスタムモデルなしで変更できますか?
DjangoにはDATE_FORMATおよびDATE_TIME_FORMATオプションがあり、日付を表示するときに使用する形式を選択できますが、Django Adminで編集または追加するときに日付の入力形式を変更できないようです.
管理者のデフォルトは次のとおりです: YYYY-MM-DD
しかし、使用するのは素晴らしいでしょう: DD-MM-YYYY
これはいずれにしても i18n に統合されていますか? これはカスタムモデルなしで変更できますか?
Django チケット 6483が終了し、 Django 1.2 がリリースされて以来、これを行う公式の方法があります。
USE_L10N
に設定した場合は、 で とFalse
を指定する必要がDATE_INPUT_FORMATS
ありDATETIME_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
、my サイトは と呼ばれgolf
、myFORMAT_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
ます。
l10n を無効にして日付形式を明示的に設定するように設定を変更しました。
USE_L10N = False
DATE_FORMAT = 'd-m-Y'
DATETIME_FORMAT = 'd-m-Y H:i'
DATE_INPUT_FORMATS も設定できます。
今のところこれは自分で行う必要がありますが、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はリストであるため、複数の可能性を指定でき、ユーザー入力を解析するときにそれらを順番に試行することに注意してください。
このアイデアに基づいて、新しい 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)
最初に既存の「標準」django形式に私の形式(たとえば31.12.2007)を追加することに注意してください。
使用法:
from mydbfields import EuDateField
class Person(models.Model):
...
birthday = EuDateField("Birthday", null=True, blank=True, help_text="")
私の場合、これは管理者でうまくレンダリングされますが、おそらくModelFormでもうまくレンダリングされます(試していません)。
私のジャンゴのバージョンは次のとおりです。
>>> import django
>>> django.get_version()
u'1.1 alpha 1 SVN-10105'
私が理解しているように、これはまだサポートされていないようです。はい、今のところカスタム作業を行う必要があります。
文字列としてではなく、タプルとして記述しないように注意してください。例えば:
DATE_INPUT_FORMATS = ('%d.%m.%Y',)
フォームに日付を書き込む有効な方法を1つだけにしたい場合。