見出し画像

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'

ビューの主な役割:

  1. データベースからデータを取得

  2. フォームの処理

  3. テンプレートのレンダリング

  4. ビジネスロジックの実行

ビューと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})

ビューの処理の流れ:

  1. URLsがリクエストを適切なビューに転送

  2. ビューがモデルからデータを取得

  3. ビューがデータをテンプレートに渡す

  4. レンダリングされた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の設計にも適しています。

いいなと思ったら応援しよう!

K
サポートもお待ちしております! 頂いたサポートは今後の創作活動費用として、noteとYouTubeに活用させていただければと考えております!