Django 2.x で Haml ライクなテンプレートを使う
Django記事シリーズ
- Django 2.x でHamlライクなテンプレートを使う - 人生シーケンスブレイク
- Django 2.x でHamlライクな Bootstrap 4 を使う - 人生シーケンスブレイク
- Django 2.x で Sass / SCSS を使う - 人生シーケンスブレイク
- Django 2.x で Rails みたいに jquery-ujs を使って二重submit抑止やconfirmをカンタンに実装する - 人生シーケンスブレイク
の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インストールの際はgcc
とmusl-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。
参考として、↓のリポジトリにソースコードを公開しています。 github.com
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る