django(Python) 〜基礎編〜

テクノロジー

当記事は以前書いた記事【django(Python) 〜準備編〜】の続きとなっております。
プロジェクトもその回のものを使用する為、先にそちらをご確認くださいませ。

それでは、引き続きToDoアプリの作成を行いましょう!
本日はフロント画面を作成します。
※量が多くなった為、データ追加の方法は次記事にします。

フロント用のディレクトリの準備

まずは、HTMLやCSSファイルを置いておくためのディレクトリを作成しましょう。

今回はルートディレクトリに[src]ディレクトリを作成し、その中にと[static](さらにstaticの中で[css]や[js]など)ディレクトリを準備します。

現在、階層は以下のようになっております。
※ 【__pycache__】というのはキャッシュデータが入っているディレクトリです。
その為、階層表示では省いております。

【階層】 ※赤字追加
ToDo/
 ├ ToDo/ ※アプリディレクトリ
    ├ __init__.py
    ├ apps.py
    ├ models.py
    ├ views.py
    ├ admin.py
    ├ migrations/
        ├ __init__.py
        └ 0001_initial.py
    └ tests.py
 ├ config/
    ├ __init__.py
    ├ asgi.py
    ├ settings.py
    ├ urls.py
    └ wsgi.py
 ├ db.sqlite3
 ├ manage.py
 └ src/
    ├ html/
    └ static/
        ├ css/
        └ js/

パスの設定

ディレクトリを作成しただけでは、djangoがどこにファイルがあるのかわかりません。
その為、「HTMLやCSSといったファイルは 〇〇 にあります」ということを宣言しておく必要がございます。

config/settings.pyの60行目くらいに

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

とありますね?
そのDIRSの中身を【BASE_DIR / 'HTMLディレクトリ'】に変えてやってください。

今回の場合は、

'DIRS': [BASE_DIR / 'src/html'],

という感じです。
BASE_DIRとは、このプロジェクトの基となるディレクトリを指しており、
config/settings.pyの15行目くらいにある

BASE_DIR = Path(__file__).resolve().parent.parent

この部分で設定しております。
まあ、あまり深く考える必要はありませんね。

先ほど行ったのはhtmlファイルがどこに入っているの宣言だけなので、次はcssやjsがどこに入っているかを宣言します。
同じく、config/settings.pyの120行目くらいの

STATIC_URL = 'static/'

の下に【STATICFILES_DIRS = [BASE_DIR / 'Staticディレクトリ']】を追記します。
今回の場合、以下のようになります。

STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / 'src/static']

これで、今後ページを作る際はこちらを読み込むようになります。

表示方法

index.htmlとstyle.cssを作成

src/htmlの中にindex.htmlを、
src/static/cssの中にstyle.cssを作ってみましょう。

中身は

{% load static %}
<link rel="stylesheet" href='{% static "css/style.css" %}'/> 
<h1>テスト</h1>
h1 {color: red; }

としましょう。
大体わかりますね?
index.htmlではh1タグで「テスト」という文字を表示し、
style.cssではh1タグの文字色を赤色にしています。

ちなみにindex.htmlの1行目の

{% load static %}

この部分ですが、
djangoを使用しているとhtml内でこんな感じの少し変わった処理を書くことができます。
他にどのようなことができるかは、後ほどご説明いたしますが、
ここでは、先ほど準備したstaticディレクトリを使用するための宣言をしています。

また2行目では

{% static "css/style.css" %}

ここではstaticディレクトリを呼び出し、その中のcss/style.cssのパスを取得しています。

viewsの設定

次にindex.htmlを読み込む関数を準備します。
アプリディレクトリのToDo/views.py の
# Create your views here. の下に追記

# Create your views here. の下に追記
def index(request):
    return render(request, 'index.html')

URLの設定

config/urls.pyの二箇所を修正します。
まずは、 from django.urls import path の下に追記(17行目)
from アプリ名.views import *

from django.contrib import admin
from django.urls import path

# ↓追加
from ToDo.views import *
# ↑追加

先ほど追記したToDoのviews.pyをこっちのファイル(urls.py)でも使用するといった感じのやつですね。

そして、その下にある urlpatterns = [ リストの最後に
path('', index) と追記します。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index), # ←追加
]

path('URL', ビュー) という構成です。
例えば、第一関数を 'test' とした場合、
接続先は http://127.0.0.1:8000/test となります。

また、第二関数では先ほど記載したToDo/views.pyのindex関数を呼び出しております。
今後ユーザーページを作りたい場合、
同じようにToDo/views.pyにuser関数を作成し、
urlpatternsにて path('user', user) を追記すればいいわけです。

それでは、http://127.0.0.1:8000にアクセスしてみましょう。

もっと派手なやつにすればよかった。。。。

変数データを使う

もちろん、Pythonで引数を渡しHTML内で表示することが可能です。

先ほど作った、ToDo/views.pyのindex関数の中身を少し修正します。

def index(request):
    datas = {'text': 'Hello!'} # 追記
    return render(request, 'index.html', context=datas) # ちょい修正

datas = {'text': 'Hello!'} :datasという辞書の作成。
context=datas :上で作った datas をフロントでも使用します。という宣言。

それでは、HTMLファイルの方も編集しましょう。
src/html/index.html です。
ここで少し複雑な部分があり、HTMLファイル内で使用する場合は
datas['text']とするのではありません。

では、実際にどのように使うのか見てみましょう!

<h1>テスト</h1> の部分を <h1>{{ text }}</h1> に変更するだけです!
この {{ text }} が上で作成した datas['text'] を使用する宣言となります。

{% load static %}
<link rel="stylesheet" href='{% static "css/style.css" %}'/> 
<h1>{{ text }}</h1>

やっぱり地味だなあ。。。。。

ちなみにHTMLで取得する引数を増やすには、
datas = {'text': 'Hello!'} の部分に
datas = {'text': 'Hello!', 'num' : 3} のように追加していきます。

その他

if文

{% if 条件 %}
処理
{% endif %}

{% load static %}
<link rel="stylesheet" href='{% static "css/style.css" %}'/> 
<h1>{{ text }}</h1>

{% if num == 3 %}
    <h3>Number:{{ num }}</h3>
{% endif %}

else if、elseは?

{% if 条件1 %}
処理1
{% elif 条件2 %}
処理2
{% else 条件3 %}
処理3
{% endif %}
{% load static %}
<link rel="stylesheet" href='{% static "css/style.css" %}'/> 
<h1>{{ text }}</h1>

<h3>Number:{{ num }}</h3>
{% if num == 1 %}
    <h4>この数値は1です</h4>
{% elif num == 2 %}
    <h4>この数値は2です</h4>
{% else %}
    <h4>この数値は1でも、2でもありません</h4>
{% endif %}

for文

リスト内ループ

{% for item in リスト %}
    <p>{{ item }}</p>
{% endfor %}
リストの準備
from django.shortcuts import render

# Create your views here.
def index(request):
    datas = {'text': 'Hello!', 'num' : 3}

    # ↓追記
    datas['list'] = ['奈良', '大阪', '京都', '滋賀', '三重', '和歌山', '兵庫']
    # ↑追記

    return render(request, 'index.html', context=datas)

※ 後からデータを追加しているだけで、
datas = {'text': 'Hello!', 'num' : 3, 'list' : ['奈良', '大阪', '京都', '滋賀', '三重', '和歌山', '兵庫']}
と同じです。(見づらいから分けました。)

ループ処理
{% load static %}
<link rel="stylesheet" href='{% static "css/style.css" %}'/> 
<h1>{{ text }}</h1>

<h3>Number:{{ num }}</h3>
{% if num == 1 %}
    <h4>この数値は1です</h4>
{% elif num == 2 %}
    <h4>この数値は2です</h4>
{% else %}
    <h4>この数値は1でも、2でもありません</h4>
{% endif %}

{% for item in list %}
    <p style="color: red;">{{ item }}</p>
{% endfor %}

数回ループ

{% with ''|center:ループ回数 as num %}
    {% for _ in num %}
        <p>{{ forloop.counter }}</p>
    {% endfor %}
{% endwith %}
{% load static %}
<link rel="stylesheet" href='{% static "css/style.css" %}'/> 
<h1>{{ text }}</h1>

<h3>Number:{{ num }}</h3>
{% if num == 1 %}
    <h4>この数値は1です</h4>
{% elif num == 2 %}
    <h4>この数値は2です</h4>
{% else %}
    <h4>この数値は1でも、2でもありません</h4>
{% endif %}

{% for item in list %}
    <p style="color: red;">{{ item }}</p>
{% endfor %}

{% with ''|center:15 as num %}
    {% for _ in num %}
        {{ forloop.counter }},
    {% endfor %}
{% endwith %}

終わり

これにて、djangoでのHTMLの書き方を終了します。
お疲れ様でした。

次の記事はとうとうデータの追加を行います!

コメント

タイトルとURLをコピーしました