Progateで作ったWebアプリをDjangoで作ってみる! Part2 -TemplateView編-
ProgateのNode.jsコースではお買い物リストアプリを作るのですが、これと全く同じものをDjangoで作ってみます。
Djangoでのアプリ開発の一連の流れを整理するために記していきます。
HTMLとCSS、PNG形式画像は使い回しで、一部をDjango用のタグに変えます。
前回のおさらい
Part1では、はじめに、①プロジェクトを作成して、その次に②アプリを作成して、③作成したアプリをsetting.pyに登録して、最後に④urls.pyの設定をしました。
今回はトップページを作っていきます。
テンプレート
Djangoを使って、HTMLの表示内容をいろいろ操作できます。Djangoで作成できる表示ページをテンプレートと言います。テンプレートは、Webページの中にいろいろな変数を組み込んだもので、Djangoがテンプレートを読み込んで、変数を代入して、ページを完成していくイメージです。
まずはテンプレートと静的ファイルを置く場所を用意します。
Djangoではアプリごとにtemplatesフォルダを作成して、その中にさらにアプリ名のフォルダを作成します。
今回の場合は、
「listapp」→「list」→「templates」→「list」
となります。
フォルダの作成は、Visual Studio Codeのエクスプローラーの「新しいフォルダー」アイコンか、cd
コマンドでディレクトリに移動して、mkdir
コマンドで作成します。
「templates」フォルダの「list」フォルダに、「top.html」ファイルを作成します。
静的ファイルのフォルダも同様に、
「listapp」→「list」→「static」→「list」
とします。
「static」フォルダの「list」フォルダに、「style.css」ファイルを作成し、使う画像ファイルも格納します。
Part1でsetting.pyのINSTALLED_APPSにアプリを登録したことで、Djangoのテンプレート機能が「templates」フォルダを検索してくれます。一つのプロジェクトに複数のアプリがあって、「templates」フォルダ直下に同じ「top.html」ファイルがあった場合、Djangoは区別できないので、「templates」フォルダの下にアプリ名のフォルダを入れて、その下にテンプレートファイルを置きます。静的ファイルも同様の考えです。
はじめての Django アプリ作成、その3
はじめての Django アプリ作成、その6
この時点でのディレクトリ構成は以下です。
C:
│ db.sqlite3
│ manage.py
│
├─list
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ urls.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ │ __init__.py
│ │ │
│ │ └─__pycache__
│ │ __init__.cpython-38.pyc
│ │ __init__.cpython-39.pyc
│ │
│ ├─static # ☆
│ │ └─list # ☆
│ │ style.css # ☆
│ │ top.png # ☆
│ │
│ ├─templates # ☆
│ │ └─list # ☆
│ │ top.html # ☆
│ │
│ └─__pycache__
│ admin.cpython-38.pyc
│ admin.cpython-39.pyc
│ apps.cpython-38.pyc
│ apps.cpython-39.pyc
│ models.cpython-38.pyc
│ models.cpython-39.pyc
│ urls.cpython-38.pyc
│ urls.cpython-39.pyc
│ views.cpython-39.pyc
│ __init__.cpython-38.pyc
│ __init__.cpython-39.pyc
│
└─listapp
│ asgi.py
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
│
└─__pycache__
settings.cpython-38.pyc
settings.cpython-39.pyc
urls.cpython-38.pyc
urls.cpython-39.pyc
wsgi.cpython-38.pyc
wsgi.cpython-39.pyc
__init__.cpython-38.pyc
__init__.cpython-39.pyc
TopページのHTMLファイルを作る
もともとのHTMLファイルをそのまま使いますが、Django用のタグに一部変えていきます。CSSファイルは特に変更しないのでそのまま貼り付けておきます。
静的ファイルを使う場合は、最初に以下のタグを入れます。
{% load static %}
テンプレートファイルで静的ファイルを読み込むアドレスは{% static %}
タグを使います。
<link>
タグにあるhref
属性を以下のようにします。
<link rel="stylesheet" href="{% static 'list/style.css' %}">
画像ファイルを読み込むために以下のようにします。
<img src="{% static 'list/top.png' %}">
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>LIST APP</title>
<link rel="stylesheet" href="{% static 'list/style.css' %}">
</head>
<body>
<div class="top-wrapper">
<div class="top-detail">
<h2 class="subtitle">買い物リストアプリ</h2>
<h1 class="title">LIST APP</h1>
<p class="description">
LIST APPは、買い物をリストアップするサービスです。
<br>
買いたいものをリストに登録してみましょう。
</p>
<a href="/index" class="index-button">一覧を見る</a>
</div>
<div class="top-image">
<img src="{% static 'list/top.png' %}">
</div>
</div>
</body>
</html>
TemplateView
Topページを表示するために、TemplateViewというDjangoがあらかじめ用意しているclassに書かれている関数や変数を使えるようにします。
TemplateView
をインポートするコードを追加します(☆1)。
ListTop
クラスを作成し、TemplateViewを継承します(☆2)。template_name
を指定することで、どのHTMLファイルを使うかをDjangoに伝えています(☆3)。
from django.shortcuts import render
from django.views.generic import TemplateView #☆1
class ListTop(TemplateView): # ☆2
# top.htmlをレンダリング
template_name = 'list/top.html' # ☆3
urls.pyの設定
views.pyのListTopクラスを読み込みます(☆4)。
urlpatterns
にコードを追加します。クラスを読み込む場合はas.viewメソッドをつけます。name
という引数で、このpathをtopという名前に設定しています(☆5)。
from django.urls import path
from .views import ListTop # ☆4
urlpatterns = [
# リクエストされたパス部分が''に合致した場合、views.pyのListTopクラスをインスタンス化する
path('', ListTop.as_view(), name='top'), # ☆5
]
これでトップページは完成です!
python manage.py runserver
でサーバーを起動し、「http://localhost:8000/」にアクセスするとちゃんと表示されていました!
Part3に続きます!
Author And Source
この問題について(Progateで作ったWebアプリをDjangoで作ってみる! Part2 -TemplateView編-), 我々は、より多くの情報をここで見つけました https://qiita.com/insilicomab/items/bab360f4d1503034ddf5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .