Djangoメモ(34) : humanizeで日時などをわかりやすく表示(naturaltime, intcomma, ordinal...)
A Complete Beginner's Guide to Djangoのチュートリアルを参考にDjango テンプレートフィルタセットのhumanizeを使用してみる。
humanize
humanizeはドキュメントの説明によると"データに「人間くささ(human touch)」を与えるための Django テンプレートフィルタセット"とのこと。例えば日時情報が"5日, 20時間前"のように表示される。
humanizeを使用するためにはmyproject/settings.py
のINSTALLED_APPS
に'django.contrib.humanize'
を追加する。
INSTALLED_APPS = [
...
'django.contrib.humanize',
...
]
次にtemplates/topics.html
を編集。
{% load humanize %}
によりhumanizeをロードして|naturaltime
フィルタを追加する。
{% extends 'base.html' %} {% load humanize %} {% block content %} <!-- code suppressed --> <td>{{ topic.last_updated|naturaltime }}</td> <!-- code suppressed --> {% endblock %}
これで図のように日時情報の表示がわかりやすくなる。
使用可能なフィルタ
humanizeでは以下のフィルタが利用できるのでLANGUAGE_CODE = 'ja'
で動作を確認してみる。
apnumber
1-9の数字に対して、数をアルファベットで表示する。
なお、LANGUAGE_CODE = 'ja'
では何も変わらなかったのでコメントアウトして確認している。
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
{% for value in values %} <p>{{ value|apnumber }}</p> {% endfor %}
intcomma
カンマ区切りで表示するがsettings.py
に下記コードを追加する必要がある(ソースコードを見るとコメントアウトされている)。
NUMBER_GROUPING = 3
values = [1, 2, 1234, 12345678]
{% for value in values %} <p>{{ value|intcomma }}</p> {% endfor %}
intword
大きな数値を1.23 million
などで表示するが、日本語だと1.23 ミリオン
のようになるので微妙。
value = [1, 2, 1234, 12345678, 1234567890, 1234567890123]
{% for value in values %} <p>{{ value|intword }}</p> {% endfor %}
naturalday
日付が昨日、今日、明日の場合に昨日
、今日
、明日
として表示する。それ以外の場合は2018年4月3日
のような表示になる(DATE_FORMAT
の設定)。
today = datetime.today() values = [today - timedelta(days=1), today, today + timedelta(days=1), today + timedelta(days=2)]
{% for value in values %} <p>{{ value|naturalday }}</p> {% endfor %}
naturaltime
何時間(分、秒)前、または今から何時間(分、秒)であったかを表わす文字列で表示する。
now = datetime.now() values = [ now, now - timedelta(seconds=10), now - timedelta(minutes=30), now - timedelta(hours=3), now - timedelta(days=2), now - timedelta(weeks=1), now + timedelta(seconds=10), now + timedelta(minutes=30), now + timedelta(hours=3), now + timedelta(days=2), now + timedelta(weeks=1), ]
{% for value in values %} <p>{{ value|naturaltime }}</p> {% endfor %}
ordinal
整数を序数で表示する。英語だと1st
、2nd
、3rd
、4th
のようになるが日本語だと番目
になる。
values = [1, 2, 1234, 12345678]
{% for value in values %} <p>{{ value|ordinal }}</p> {% endfor %}
まとめ
- humanizeを使うと日時情報などをわかりやすく表示できる
- 利用可能なフィルタは
apnumber
,intcomma
,intword
,naturalday
,naturaltime
,ordinal