LoginSignup
7
6

More than 5 years have passed since last update.

テンプレートから出力される日付・時刻のフォーマットを変更する方法

Last updated at Posted at 2015-02-05

目的

タイトルの通り。
ただし、毎回テンプレートフィルタを使ってフォーマットを指定するのではなく、何も考えずに

{{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のもの)

formats.py
# -*- 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

formats.py
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は、ちゃんとカスタムのフォーマットが適用されてくれた。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6