人生シーケンスブレイク

人生を楽してクリアしたい。当面はPython学習帳

Django 2.x で Haml ライクなテンプレートを使う

Django記事シリーズ

の1つ目。

nyaruka/django-hamlpy を入れてHamlライクなシンタックスを実現する。

django-hamlpy は特にアナウンスされてないがDjango 2.0.3 でも動作が確認できた。また、Django 1.11.7でも以前に動作確認済み。
ちなみに上記のフォーク元の jessemiller/HamlPy はメンテされていないので現在は動かない。

導入手順

django-halmpyインストール

$ pip install django-hamlpy

補足: alpine環境でdjango-hamlpyインストールの際はgccmusl-devが事前に必要。

ENV RUNTIME_PACKAGES="gcc musl-dev"
RUN apk --update add $RUNTIME_PACKAGES

settings.py変更

テンプレートローダーへ追加

*.haml*.hamlpy ファイルをテンプレートとして読み込み可能にする為に、settings.pyのTEMPLATES内のloadersを以下のように書き換える。

TEMPLATES=[
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['./templates'],
        'OPTIONS': {
            'context_processors': [...] # 略
            'loaders': (
                'hamlpy.template.loaders.HamlPyFilesystemLoader',
                'hamlpy.template.loaders.HamlPyAppDirectoriesLoader',
            ), 
        }
    }
]

APP_DIRS オプションは loaders オプションと競合するので注意。

補足: テンプレートキャッシュを使う場合

本番環境などでテンプレートキャッシュを利用したい場合には、以下のようにする。

TEMPLATES=[
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['./templates'],
        'OPTIONS': {
            'context_processors': [...] # 略
            'loaders': (
                ('django.template.loaders.cached.Loader', (
                    'hamlpy.template.loaders.HamlPyFilesystemLoader',
                    'hamlpy.template.loaders.HamlPyAppDirectoriesLoader',
                    ...
                )),
            )
        }
    }
]

既存テンプレート書き換え

今回は Writing your first Django app, part 1 | Django documentation | Django の polls/index.html を例に書き換えしてみる。

Before: polls/index.html

{% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

After: polls/index.html.haml

- load static

  %link{ rel: 'stylesheet', type: 'text/css', href: "{% static 'polls/style.css' %}" }

- if latest_question_list
  %ul
    - for question in latest_question_list
      %li
        %a{ href: "{% url 'polls:detail' question.id %}" }
          = question.question_text
- else
  %p
    No polls are available.

views.py書き換え

template_nameを.haml付きに書き換える。

class IndexView(generic.ListView):
    template_name = 'polls/index.html.haml'

これでエラー無く表示できたらOK。

f:id:ShineSpark:20180312183805p:plain

参考として、↓のリポジトリソースコードを公開しています。 github.com