Djangoデフォルトのテンプレートエンジンを使ったほうが幸せになれるかもしれない話
2017/02/02 18:39
  • Webフレームワークのテンプレートエンジンって、何を選択すべきか結構迷ったり、悩んだり。
    選定に無駄に時間がかかったりします。

    Smarty, Twig, Ninja, Jade, ...挙げればキリがないですが、個人的には
    コーディング量が圧倒的に少ない(ような気がする)Jadeがお気に入りだったりします。
    (名称変更してPugになってますが。。)

    【Jade】ゴリラでもわかるJade入門 〜Jadeを使ってみる〜
    pyjade

    普通にJade使う場合は、HTMLに変換するためにコンパイルが必要になりますが、Djangoのライブラリとして提供されているpyjadeは
    特に意識することなく動的にコンパイルしてくれます。(∩´∀`)∩ワーイ

    そんな中、日時の取扱いで困った事象に遭遇してしまう

    Djangoの設定で以下のようにUSE_TZの設定をしている場合、TIME_ZONE の値に関係なく、DBに登録される日時(created_at, updated_at)はUTCの時刻で登録されるようになってしまいます。(DBはUTC日時にして、テンプレート出力時に各ロケールに合わせて調整を入れる、というポリシー。)

    LANGUAGE_CODE = 'ja'
    
    TIME_ZONE = 'Asia/Tokyo'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    

    pyjadeを使った場合

    ぼくは最初からpyjadeを使っていたので、そういうもんだよねーって感じで、でもちょっとめんどくさいなーっと思いつつ以下の対応を入れていました。
    とりあえずFalseにするw
    USE_TZ = False
    

    で、いざ日付表示をテンプレートで確認してみると、"2017-01-22 14:18:57.280053" とか表示されるわけですよ。
    タイムゾーンの設定をオフにしているので現在の日本時間でDBにレコードが登録されるようにはなるんですが、ミリ秒も一緒に表示されちゃう。笑(これは別の問題だが)

    やっぱりめんどくさいなーって思いながら(2回目)、以下のような対応をしてます。

    class HogeListView(ListView)
        def get_context_data(self, **kwargs):
            context = super(HogeListView, self).get_context_data(**kwargs)
            object_name = super(HogeListView, self).get_context_object_name(self)
    
            for index, value in enumerate(context[object_name]):
                context[object_name][index].created_at = value.created_at.strftime('%Y-%m-%d %H:%M')
                context[object_name][index].updated_at = value.updated_at.strftime('%Y-%m-%d %H:%M')
    
            return context
    

    今思うと、結構涙ぐましいですね。都度日付をフォーマットしてます。

    デフォルトのテンプレートエンジンを使った場合

    タイムゾーン、ミリ秒、特に何も考えることなく以下でOK。

    {{ hoge.updated_at }}
    {{ hoge.created_at }}
    

    これだけで、設定されたタイムゾーンにあった日時にフォーマットしてくれます。(東京の場合は、2017年1月1日 00:00、みたいな)
    まぁ、内部的にやってることは同じだとは思いますが、それを意識することなく実現できるってほんと便利。
    Djangoのテンプレートエンジンはそのあたり非常によくできていると思います。

    基本的に生のHTMLを書かないといけないっていうのがネックですが、タグもフィルターも充実しているので
    それにあやかるのが爆速コーディングにつながるのかなーと思ったりしています。

    Django template (公式ドキュメント)


    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • <2017/02/02 18:39>
  • プログラミング
  • Djangoテンプレートエンジンpyjadepythondate日付フォーマット
  • 新しい記事へ
    gitのリポジトリごとにname, emailを変更する方法

    古い記事へ
    Djangoでユーザーログイン後に元いたページにリダイレクトする方法

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。