Django基礎#4 ビューとテンプレートの基本
ビューの作成 / views.py
Djangoのビュー(views.py)は、Webアプリケーションのロジックを定義する重要な部分です。
ビューは、HTTPリクエストを受け取り、HTTPレスポンスを返す Python 関数またはクラスです。
関数ベースのビューの例:
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return HttpResponse("Hello, welcome to the index page.")
def detail(request, question_id):
return HttpResponse(f"You're looking at question {question_id}.")
クラスベースのビューの例:
from django.views import generic
from .models import Book
class BookListView(generic.ListView):
model = Book
template_name = 'book_list.html'
ビューの主な役割:
データベースからデータを取得
フォームの処理
テンプレートのレンダリング
ビジネスロジックの実行
ビューとURLの連携:
urls.py ファイルでビューとURLパターンを関連付けます。
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
]
テンプレートの使用:
ビューは render() 関数を使用してテンプレートをレンダリングします。
def book_list(request):
books = Book.objects.all()
return render(request, 'book_list.html', {'books': books})
ビューの処理の流れ:
URLsがリクエストを適切なビューに転送
ビューがモデルからデータを取得
ビューがデータをテンプレートに渡す
レンダリングされたHTMLがユーザーに返される
ビューは Django アプリケーションの中心的な役割を果たし、ユーザーリクエストの処理、データの取得と操作、そしてレスポンスの生成を担当します。
適切に設計されたビューにより、コードの再利用性と保守性が向上します。
テンプレートエンジンの基本とHTMLの埋め込み
Djangoのテンプレートエンジンは、動的なHTMLを生成するための強力なツールです。テンプレートは静的なHTMLと特別な構文を組み合わせて作成され、動的なコンテンツを挿入する方法を定義します。
テンプレートの基本構文:
変数の表示:
変数は {{ variable }} のように二重中括弧で囲みます。
例: <p>Welcome, {{ user.username }}!</p>
タグの使用:
タグは {% tag %} のように記述し、制御構造やロジックを実装します。
例:
{% if user.is_authenticated %}
<p>Hello, {{ user.username }}!</p>
{% else %}
<p>Please log in.</p>
{% endif %}
フィルタの適用:
フィルタは | を使って変数に適用し、値を変換します。
例: {{ text|upper }}
テンプレートの継承:
base.htmlを作成し、子テンプレートで拡張します。
base.html:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
child.html:
{% extends "base.html" %}
{% block title %}Welcome{% endblock %}
{% block content %}
<h1>Welcome to my site!</h1>
{% endblock %}
テンプレートのインクルード:
他のテンプレートを含めるには {% include %} タグを使用します。
例: {% include "header.html" %}
ループの使用:
{% for %} タグでリストやクエリセットをイテレートできます。
例:
<ul>
{% for item in items %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
テンプレートの使用例:
views.py:
def book_list(request):
books = Book.objects.all()
return render(request, 'book_list.html', {'books': books})
book_list.html:
{% extends "base.html" %}
{% block content %}
<h1>Book List</h1>
<ul>
{% for book in books %}
<li>{{ book.title }} by {{ book.author }}</li>
{% empty %}
<li>No books found.</li>
{% endfor %}
</ul>
{% endblock %}
Djangoのテンプレートエンジンを使用することで、HTMLとPythonのロジックを分離し、保守性の高い動的なWebページを作成できます。
テンプレートの継承やインクルードを活用することで、コードの再利用性も向上します。
URLとビューの連携
DjangoのURLとビューの連携は、Webアプリケーションの基本的な構造を形成する重要な要素です。この連携は主にURLconf(URL設定)ファイルを通じて行われます。
URLconfの基本構造:
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
この例では、3つのURLパターンが定義されており、それぞれ対応するビュー関数にマッピングされています。
URLパターンの動的部分:
``や``のような部分は、URLの動的な部分を表し、これらの値がビュー関数の引数として渡されます。
ビュー関数の例:
def year_archive(request, year):
# yearパラメータを使用してロジックを実装
return HttpResponse(f"Year archive for {year}")
def article_detail(request, year, month, slug):
# 各パラメータを使用して記事を取得
article = get_object_or_404(Article, pub_date__year=year, pub_date__month=month, slug=slug)
return render(request, 'article_detail.html', {'article': article})
URLパターンの名前付け:
path('articles/<int:year>/', views.year_archive, name='year_archive'),
名前付きURLパターンを使用することで、テンプレートやビュー内でURLを逆引きできます。
プロジェクトレベルとアプリケーションレベルのURL:
プロジェクトのメインURLconfで各アプリケーションのURLconfをインクルードすることで、モジュール性を高めることができます。
from django.urls import include, path
urlpatterns = [
path('blog/', include('blog.urls')),
path('polls/', include('polls.urls')),
]
クラスベースビューの使用:
from django.urls import path
from .views import ArticleListView
urlpatterns = [
path('articles/', ArticleListView.as_view(), name='article_list'),
]
この構造により、URLとビューの間の明確な対応関係が作られ、コードの可読性と保守性が向上します。
また、動的なURLパターンを使用することで、柔軟なルーティングが可能になり、RESTfulなAPIの設計にも適しています。