もた日記

くだらないことを真面目にやる

Djangoメモ(34) : humanizeで日時などをわかりやすく表示(naturaltime, intcomma, ordinal...)

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にDjango テンプレートフィルタセットのhumanizeを使用してみる。


humanize

humanizeはドキュメントの説明によると"データに「人間くささ(human touch)」を与えるための Django テンプレートフィルタセット"とのこと。例えば日時情報が"5日, 20時間前"のように表示される。
humanizeを使用するためにはmyproject/settings.pyINSTALLED_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 %}

これで図のように日時情報の表示がわかりやすくなる。

f:id:wonder-wall:20180401191700p:plain


使用可能なフィルタ

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 %}

f:id:wonder-wall:20180401184900p:plain

intcomma

カンマ区切りで表示するがsettings.pyに下記コードを追加する必要がある(ソースコードを見るとコメントアウトされている)。

NUMBER_GROUPING = 3


values = [1, 2, 1234, 12345678]
{% for value in values %}
  <p>{{ value|intcomma }}</p>
{% endfor %}

f:id:wonder-wall:20180401184020p:plain

intword

大きな数値を1.23 millionなどで表示するが、日本語だと1.23 ミリオンのようになるので微妙。

value = [1, 2, 1234, 12345678, 1234567890, 1234567890123]
{% for value in values %}
  <p>{{ value|intword }}</p>
{% endfor %}

f:id:wonder-wall:20180401184515p:plain

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 %}

f:id:wonder-wall:20180401190128p:plain

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 %}

f:id:wonder-wall:20180401191022p:plain

ordinal

整数を序数で表示する。英語だと1st2nd3rd4thのようになるが日本語だと番目になる。

values = [1, 2, 1234, 12345678]
{% for value in values %}
  <p>{{ value|ordinal }}</p>
{% endfor %}

f:id:wonder-wall:20180401184034p:plain


まとめ

  • humanizeを使うと日時情報などをわかりやすく表示できる
  • 利用可能なフィルタはapnumber, intcomma, intword, naturalday, naturaltime, ordinal