SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Django3で「共通テンプレート(HTML)」を使って、無駄な繰り返し記述を防ぐ

f:id:arakan_no_boku:20190320212948j:plain 

目次

親になる共通テンプレートの書き方

複数画面で構成されるシステムの場合、、同じ記述の繰り返しを防ぐため、各画面に共通のHTMLと個別画面で異なるHTMLを分離して、共通部分を再利用できるようにしておく必要があります。

Djangoではテンプレートを各画面で共有することで実現できます。

Djangoのテンプレートを共有するためのHTMLの書き方は、

  • 親のHTML側で処理を差し込むブロックを書く。
  • 子のHTML側でそのブロックの中に差し込む処理だけを書く。

ことになります。 

親のHTML側の記述サンプル

処理を差し込むブロックを{% block xxxxx %}{% endblock %}で書きます。

今回用意するblockは3つです。

header要素を差し込むブロック

{% block header %}{% endblock %}

titleのブロック

{% block title %}{% endblock %} 

 bodyのブロック

{% block content %}{% endblock %}

です。

base.htmlのソースコード 

{% load static %} 
{% load widget_tweaks %}

<!DOCTYPE html>
<html lang="jp">
	<head>
		<!-- Required meta tags -->
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
		<link rel="stylesheet" href="https://fonts.xz.style/serve/inter.css" />
		<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css" />
		{% block header %} {% endblock %}
		<title>{% block title %}デモ用テンプレート{% endblock %}</title>
	</head>
	<body>
		<h3>これは共通フォーマットのタイトルです</h3>
		<table>
			{% block content %} 
			{% endblock %}
		</table>
	</body>
</html>
ブロックの中に差し込む子HTML側サンプル

共通テンプレートができたので、今度はそれを利用する側をやっていきます。

親側で定義した3つのブロック

  • {% block header %}{% endblock %}
  • {% block title %}{% endblock %} 
  • {% block content %}{% endblock %}

の間に流し込む処理だけを記述していきます。

例えば、以下のような感じです。

{% extends 'base.html' %}
{% load static %} 
{% load widget_tweaks %} 
{% block header %}
 <meta name="dummy" />
{% endblock %} 

{% block title %} やあ。こんにちは。 
{% endblock %} 

{% block content %}
<tr>
	<td colspan="2"><img src="{% static "images/k.png" %}" /></td>
</tr>
<form action="" method="post">
	{% csrf_token %}
	<h1>ビルトインフォームサンプル</h1>
	{% if ret %} {% for key,val in results.items %}
	<tr>
		<td><h4>{{ key }}</h4></td>
		<td><h4>{{ val }}</h4></td>
	</tr>
	{% endfor %} {% else %} {% for key,val in errors.items %}
	<tr>
		<td>
			<h2>{{ key }} : {{ val }}</h2>
		</td>
	</tr>
	{% endfor %} {% for field in form %}
	<tr>
		<td><h4>{{ field.label_tag }}</h4></td>
		<td>{{ field|add_class:"form-control font-weight-bold" }}</td>
	</tr>
	{% endfor %}
	<tr>
		<td colspan="2">
			<button type="submit" class="btn btn-primary">送信する</button>
		</td>
	</tr>
	{% endif %}
</form>
{% endblock %}

最初にbase.htmlを読み込んでます。

{% extends 'base.html' %}

あとは、各ブロック内にはめ込む処理だけ書いているのが、みてもらえると思います。

実行イメージ

これを実行すると。

f:id:arakan_no_boku:20210504175215p:plain

Base.htmlの枠の中に、exsample.htmlの画面が収まってます。

OKですね。

補足:今回の説明の前提

django3はインストール・設定されているものとします。

arakan-pgm-ai.hatenablog.com

以下の記事の通りstaticフォルダも設定済とします。

arakan-pgm-ai.hatenablog.com 

サンプル画面のCSSはnew.cssを使います。

HTMLタグのみ、クラス指定が不要(クラスレス)なCSSフレームワークです。

newcss.net

子HTML側のサンプルは、こちらの記事の入力画面がベースです。

arakan-pgm-ai.hatenablog.com

ではでは。