クラスベースビューでのトップページ作成について
前回の記事ではbase.html(ベーステンプレート)を作成した。
今回はクラスベースビューを用いてトップページを作成する。
現在のディレクトリ構成は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
デスクトップ └Blog2 ├app │ ├migrations │ ├__init__.py │ ├admin.py │ ├apps.py │ ├models.py │ ├tests.py │ ├views.py │ ├urls.py ├db.sqlite3 ├config │ ├・・・ │ ├settings.py │ └urls.py ├templates │ └base.html ├env_blog2 └manage.py |
前回:【Django】base.html(ベーステンプレート)の作成【ブログアプリ2】
クラスベースビューでのトップページを作成する手順
urls.pyの編集
~デスクトップ/Blog2/app/urls.py
1 2 3 4 5 6 7 |
from django.urls import path, include from .views import TopPageView1, TopPageView2 #[1] urlpatterns = [ path('', TopPageView1.as_view(), name="index1"), #[2] path('index/', TopPageView2.as_view(), name="index2"), #[3] ] |
[1]views.pyからインポート
TopPageView1,TopPageView2は未作成なので、次の手順でviews.pyの中で作成する。
[2],[3]path関数を追加
新しいURLパターンを追加。
第一引数は利用者が入力したURL。URLの末尾が一致した場合に実行される。
例
[1] http:127.0.0.1:8000/app/
[2] http:127.0.0.1:8000/app/index/
第二引数はviews.pyで定義したクラスを呼び出している。
クラスベースビューで作成した場合は、「 .as_view() 」メソッドを使う。
第三引数はこのURLパターンの名前。今回はindex1, index2とした。
[2],[3]のどちらもトップページを呼び出す処理を行うのみ。
本当は片方で良いが、views.pyで定義したクラスがViewクラスとTemplateViewクラスをそれぞれ継承しているため今回はそれぞれURLパターンを作成した。
views.pyの編集
~デスクトップ/Blog2/app/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from django.shortcuts import render from django.views.generic import View, TemplateView #[1] # Create your views here. #[2] class TopPageView1(View): def get(self, request): template_name = 'index.html' return render(request, template_name) #[3] class TopPageView2(TemplateView): template_name = 'index.html' |
[1]View, TemplateViewのインポート
クラスベースビューを使うとオブジェクト指向の原則に基づいてビューを構築することができる。
Djangoには汎用ビュー(genericView)と呼ばれるクラス群があり、CRUDなどそれぞれの機能に特化したクラスがあらかじめ用意されている。
よく使われる基本的な機能は汎用ビューに元々用意されているのでコードの記述量を減らすことができる。
必要に応じて各汎用ビュークラスの内容を上書きしたり機能を追加することもできる。
また、関数ベースビューではGETメソッドかPOSTメソッドをif文を使って使い分ける必要があるが、クラスベースビューはGETとPOSTに応じて処理をかき分けることでif文での分岐が不要になる。
Viewクラスは全汎用ビューの基本となるクラス。全ての汎用ビュークラスはこのViewクラスを継承している。
ViewクラスはHTTPメソッド(POST, GET)に応じてメソッドを記述することで柔軟に処理をかき分けることができる。
TemplateViewクラスも基本となるクラスで、DBからのデータ取得は行わず、テンプレートファイルを表示させることに特化している。
[2]TopPageView1の作成
Viewクラスを継承して作成。
[3]TopPageView2の作成
こちらはTemplateViewクラスを継承して作成
[2]、[3]はどちらも同じことを行っているので片方だけで良い。
今回はどちらのクラスも使用してみたかったのでそれぞれ作成した。
index.htmlの作成
~デスクトップ/Blog2/templates/index.html
1 2 3 4 5 6 7 |
{% extends 'base.html' %} {% block title %}ブログ{% endblock %} {% block content%} <h1>トップページ</h1> {% endblock %} |
{% extends ‘base.html’ %}
base.htmlを継承していることを示す。
{% block title %}ブログ{% endblock %}
base.htmlの{% block title %}から{% endblock %}で囲われている部分に追記している。
{% block content%}
<h1>トップページ</h1>
{% endblock %}
base.html内の{% block content %} {% endblock %}で囲われた部分を継承している。
ディレクトリ構成の確認
現在のディレクトリ構成は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
デスクトップ └Blog2 ├app │ ├migrations │ ├__init__.py │ ├admin.py │ ├apps.py │ ├models.py │ ├tests.py │ ├views.py #編集 │ ├urls.py #編集 ├db.sqlite3 ├config │ ├・・・ │ ├settings.py │ └urls.py ├templates │ ├base.html │ └index.html #新規作成 ├env_blog2 └manage.py |
Django記事一覧
前回:【Django】base.html(ベーステンプレート)の作成【ブログアプリ2】
次回:【Django】クラスベースビューで一覧画面を作成【ブログアプリ2】
コメント