目的
タイトルの通り。
ただし、毎回テンプレートフィルタを使ってフォーマットを指定するのではなく、何も考えずに
{{date_obj}}
{{datetime_obj}}
のようにテンプレートに書いた時に出力されるフォーマットを変更したい、というお話。
デフォルトの挙動
先に示したとおりにテンプレートを記述すると、実際に出力されるHTMLは下記のようになる。
2015年2月5日
2015年2月5日 19:46:36
ただし、これはロケールがjaの場合の挙動。
他のロケールでは、デフォルトの出力フォーマットは当然異なる。
django.conf.localeモジュール
こうしたロケールごとの出力フォーマットは、django.conf.localeモジュール配下に定義されている。
locale配下には、さらに各国語ごとのモジュールが配置されており、日付や時刻の出力書式は、django.conf.locale.xx.formatsに定義されている
formats.py
django.conf.locale.jaの中を見ると、formats.pyというモジュールがある。中身は以下のとおり(ver1.7のもの)
# -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package.
#
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = 'Y年n月j日'
TIME_FORMAT = 'G:i:s'
DATETIME_FORMAT = 'Y年n月j日G:i:s'
YEAR_MONTH_FORMAT = 'Y年n月'
MONTH_DAY_FORMAT = 'n月j日'
SHORT_DATE_FORMAT = 'Y/m/d'
SHORT_DATETIME_FORMAT = 'Y/m/d G:i:s'
# FIRST_DAY_OF_WEEK =
# The *_INPUT_FORMATS strings use the Python strftime format syntax,
# see http://docs.python.org/library/datetime.html#strftime-strptime-behavior
# DATE_INPUT_FORMATS =
# TIME_INPUT_FORMATS =
# DATETIME_INPUT_FORMATS =
DECIMAL_SEPARATOR = '.'
THOUSAND_SEPARATOR = ','
# NUMBER_GROUPING =
この中のDATE_FORMAT, TIME_FORMAT, DATETIME_FORMATが、テンプレートに埋め込まれたdate,time,datetimeオブジェクトの出力フォーマットになる。
※settings.pyに同名のプロパティ指定しても全く挙動変わらないなー、と思ってたら、デフォルトの場合に適用されるのはこっちだった。
カスタムfomarts.pyの作成
カスタムのフォーマットファイルを用意したい場合は、フォーマットファイルの配置先を決めて、そのパスをsettings.FORMAT_MODULE_PATHに定義する。
例えば、mysiteプロジェクトにformatsフォルダを作って…という場合は、以下の様な設定&モジュール構成にする。
FORMAT_MODULE_PATH = 'mysite.formats'
mysite
└ mysite
├ __init__.py
├ settings.py
└ formats
├ __init__.py
└ ja
├ __init__.py
└ formats.py
※フォーマットファイルは、設置したパスに直接配置するのではなく、ロケールごとのフォルダを掘って、その下に配置する。
あとは、自分の好きなようにformats.pyを定義すればOK
DATE_FORMAT = 'Y/m/d'
TIME_FORMAT = 'G:i:s'
DATETIME_FORMAT = 'Y/m/d G:i:s'
とりあえず今回の目的である、日付・時刻のフォーマットだけ書いておく。
結果
2015/02/05
2015/02/05 19:46:36
出力結果のHTMLは、ちゃんとカスタムのフォーマットが適用されてくれた。