January 13, 2021
←前回:Day 7 テンプレートの継承とinclude
注意書き
この記事は単一の記事ではありません。
日記として書いているため、初見の方にはお役に立てないかと思います。
「Djangoを学びたい」とのことでありましたら[Day 1]Djangoの開発環境から読むことをおすすめします。
はじめに
今回のテーマは「TemplateViewでテンプレートを表示する」です。
テンプレートを表示するためにはViewに書いた関数でrenderを使えば良いことを紹介してきました。ここでもう1つの表示方法を紹介しておきます。
TemplateViewを使ってみる
汎用的なクラスベースビューにはTemplateView, DetailView, ListViewなどがあり、より少ないコードで表示できるよう工夫してあります。
今回はTemplateViewを使ってみます。
TemplateViewはViewクラスをオーバライドしたテンプレートを表示するためのビュークラスです。
現在のbase/views.pyを書き換えてみましょう。
from django.views.generic import TemplateView
class TopView(TemplateView):
template_name = 'base/top.html'
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['title'] = 'IT学習ちゃんねる(仮)'
return ctx
base/urls.pyも書き換えます。
urlpatterns = [
- path('', views.top, name='top'
+ path('', views.TopView.as_view(), name='top'),
]
これだけでは何のメリットがあるのか分からないかも知れませんが、クラスベースビューは頻繁に使いますので覚えておいて損はないです。
また、テンプレートにコンテキストを渡す際に、get_context_data関数をオーバーライドする方法もよく用います。(この他にも方法はあるのですが、今はこの方法だけ覚えておけばよいかと思います。)
TemplateViewのもう少し便利な使い方を見ていきましょう。
もしコンテキストをviews.pyから渡す必要がない場合はurls.pyのみで完結することも出来ます。
単順にHMTLファイルを出力したいだけの場合はviews.pyからコンテキストを渡す必要はありません。
今回は利用規約ページがそのようなページに相当する想定で実装してみます。
まずはテンプレートを用意します。
{% extends 'base/base.html' %}
{% block title %}利用規約 - {{ block.super }}{% endblock %}
{% block content %}
<div class="ui grid stackable">
<div class="eleven wide column">
<div class="ui breadcrumb">
<a href="{% url 'base:top' %}" class="section">TOP</a>
<i class="right angle icon divider"></i>
<a class="active section">利用規約</a>
</div>
<div class="ui segment">
<div class="content">
<div class="header"><h3>利用規約</h3></div>
<p>あんなことやこんなことを守って下さい。などなど</p>
<p>...............</p>
<p>...........</p>
<p>.......</p>
</div>
</div>
</div>
{% include 'base/sidebar.html' %}
</div>
{% endblock %}
base/urls.pyは以下のようにします。
from django.urls import path
+ from django.views.generic import TemplateView
from . import views
app_name = 'base'
urlpatterns = [
path('', views.top, name='top'),
+ path('terms/', TemplateView.as_view(template_name='base/terms.html'), name='terms'),
]
ここでブログの方は「ブラウザを確認すると以下のようになります。」と書いてありますがその通りにはなりません。
(私のミスかもしれない、、、)
しかし、下記のコメントで画像は間違えているという記述があり、ここは一旦スルーしても問題ないと判断したため、スルーします。
今回の学習の目的がhtmlの学習ではないので今後も見栄えに関しては気にしないことにします。
おわりに
今回はTempateViewを使ってみました。
内容に関してはまだ、わからないところがいくつかありましたがじょじょに理解していければいいかなと思ったりしています。
今心配なことは、urlが適用されているのかというところが心配になっています。
今日はこれで終わりとします。
それではまたまた