LoginSignup
43
58

More than 5 years have passed since last update.

[Python]とにかくわかりやすく!Djangoでアプリ開発!ーその2ー

Last updated at Posted at 2019-02-02

前回の記事

前回の記事→とにかくわかりやすく!Djangoでアプリ開発!ーその1ー

本記事の目的

python初心者の方が、本記事を見たあとに、一人でアプリ開発できることを目的にしております。
※インストールや開発環境については記載しません

環境

macOSX Sierra
python3.7
django 2.1.5

前回まで

プロジェクトを立ち上げ(startproject)
→アプリの作成(startapp)
→view.pyを変更してレスポンスを書く
→urls.pyを修正する

ここまででした。

ここからはHTMLを使ってテンプレート(アプリの目に見える部分)を作っていきます。

☆テンプレートの作成の前に

テンプレートを作る前に、必ずやらなければならないのがアプリケーションの設定です。
つまり「これはmyappプロジェクトの中のapp1ってアプリケーションだよ」というの宣言しておかないと、ちゃんと動作しません。

文字通り設定なのでsettings.pyのファイルをいじります。簡単ですね。

settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1',#これを追加する
]

ついでに言語の設定も変えておきます。
※本来もっと早い段階でやりますが、記事に書き忘れました。

settings.py
LANGUAGE_CODE = 'ja-JP'

TIME_ZONE = 'Asia/Tokyo'

☆テンプレートの作成

テンプレートを作成するにあたり、app1ディレクトリの配下にtemplatesフォルダを作成します。さらにその下にapp1フォルダを作成します。
この後index.htmlというHTMLのファイルを作りますが、いずれapp2,app3と作っていった時に、全部が同じindex.htmlだとどれがどれかわかなくなるので、複数の階層にしてapp1/index.htmlとして区別できるようにしてます。

フォルダができたら、その中にindex.htmlファイルを作成し、以下コードを書きます。

index.html
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>app1</title>
    </head>
    <body>
        <h1>Hello World</h1>
        <p>おはよう世界、おはよう世界、おはよう世界</p>
        <p>こんにちは世界、こんにちは世界、こんにちは世界</p>
        <p>こんばんは世界、こんばんは世界、こんばんは世界</p>
        <p>おやすみ世界、おやすみ世界、おやすみ世界</p>
    </body>
</html>

htmlを作成したので、当然このhtmlファイルにアクセスできるようにしなければいけません。
app1/urls.pyは、views.pyのaisatsu関数を呼び起こすようにしてあるので、
aisatsu関数がapp1/index.htmlを参照するように書き直します。

views.py
from django.shortcuts import render
from django.http import HttpResponse

def aisatsu(request):
    return render(request,'app1/index.html')#ここが肝!

templatesフォルダからの相対パスを指定しておきます。
以下のような感じになればOK!ちゃんとレンダリングされました!

スクリーンショット 2019-02-02 22.18.36.png

※render関数は第一引数にHttpRequestクラスのインスタンス、第二引数にhtmlファイルを指定します。
※レンダリングとは、コードで書いてあることを読み込んで、必要なものに置き換えて、画面に表示させることを言います。

☆ここから少し難しくなります

テンプレートに値を渡せるようにします。今後DBから情報を呼び出して、画面に表示させる時に大事になってくるものです。ここでは一旦view.pyに情報を入れておきます。

まずテンプレートのindex.htmlを修正します。
{{}}は変数や関数などを呼び出すためのものです。これを入れることで、レンダリングする際に、変数を参照にします。

index.html
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>{{title}}</title> <!--ここが大事-->
    </head>
    <body>
        <h1>{{title}}</h1>   <!--ここが大事-->
        <p>{{msg}}世界</p>
        <p>{{msg}}世界</p>
        <p>{{msg}}世界</p>   <!--ここが大事-->
    </body>
</html>

view.pyに情報を与えておきます。

views.py
from django.shortcuts import render
from django.http import HttpResponse

def aisatsu(request):
    params = {
        'title':'Hello Worrld',
        'msg':'こんにちは',
    }
    return render(request,'app1/index.html', params)

renderの第三引数にparamsを指定しました。
以下のような感じになればOK!
スクリーンショット 2019-02-02 22.35.41.png

ページ遷移

ページが1つしか作れないということは当然ありません。
でもそんな時にhtmlを毎度書くのも大変ですよね。なのでindex.htmlを流用してページを作っていきます。
index.htmlを以下のようにします。アンカーリンクの追加です。そのあとの{%%}はテンプレートタグで、今回はurlタグを利用しています。これで指定した名前のURLが書き出されます。ここで使われる名前は、urlpatternsでnameで指定したものを利用できます。※ここではさらにgopageというのをviews.pyに用意しています。

index.html
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>{{title}}</title> 
    </head>
    <body>
        <h1>{{title}}</h1>   
        <p>{{msg}}世界</p>
        <p>{{msg}}世界</p>
        <p>{{msg}}世界</p>
        <p><a href="{% url gopage %}">{{gopage}}</a></p> <!--ここ-->     
    </body>
</html>

遷移したことをわかりやすくするため、secondaisaisatsuページ用の情報を用意します。あと上記のgopage用のパラメタを用意します。

views.py
from django.shortcuts import render
from django.http import HttpResponse

def aisatsu(request):
    params = {
        'title':'Hello World ver1',
        'msg':'こんにちは',
        'gopage':'secondaisatsu',
    }
    return render(request,'app1/index.html', params)

def secondaisatsu(request):
    params = {
        'title':'Hello World ver2',
        'msg':'さようなら',
        'gopage':'aisatsu'
    }
    return render(request,'app1/index.html', params)

最後にsecondaisatsuにアクセスできるようにURLを準備します。
secondというURLを割り振り、secondaisatsuの処理をするようにしました。

app1/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("",views.aisatsu,name="aisatsu"),
    path("second",views.secondaisatsu,name="secondaisatsu"),
]

このように2つのページができました!

スクリーンショット 2019-02-03 0.55.19.png
スクリーンショット 2019-02-03 0.55.31.png

☆ページの装飾

ここまで来たらページの寂しさも気になると思います。cssやjavascriptでカッコよくしたい弟子すよね。

そんな時、app1/templates/app1にcssを作成するのではなく、staticフォルダというものを用意します。

上のapp1配下(templatesと同じ階層)にstaticフォルダを作り、さらにその下に、app1フォルダを作ります。さらにその下にcssというフォルダを設置し、その中にcssファイルを作っていきます。

こんな感じです。

myapp
├── app1
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── admin.cpython-36.pyc
│   │   ├── models.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── views.cpython-36.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       └── __init__.cpython-36.pyc
│   ├── models.py
│   ├── static   #これ
│   │   └── app1   #これ
│   │       └── css   #これ
│   │           └── style.css #これ
│   ├── templates
│   │   └── app1
│   │       └── index.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
└── myapp
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   ├── settings.cpython-36.pyc
    │   ├── urls.cpython-36.pyc
    │   └── wsgi.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

このstyle.cssの中身は適当に以下のようにします。
コード見ただけでトンマナないのがわかります。

style.css
body {
    color:blue;
    font-size:20pt;
}

h1 {
    color:red;
    font-size:32pt;
}

p {
    color:green;
    margin:10px;
}

a {
    color:yellow;
}

このcssを読み込むように、index.htmlも修正します。
静的ファイルを利用する際は、{% load static %}を利用します。
さらに
href="{% static 'app1/css/style.css' %}"/>
と記述することでcssファイルを呼び出します。
今回jはcssですが、javascriptやjpegなどのイメージを呼び出す時も同じコードになります。

index.html
{% load static %} #ここ
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>{{title}}</title>
        <link rel="stylesheet" type="text/css"
        href="{% static 'app1/css/style.css' %}"/> #ここ
    </head>
    <body>
        <h1>{{title}}</h1>   
        <p>{{msg}}世界</p>
        <p>{{msg}}世界</p>
        <p>{{msg}}世界</p>
        <p><a href="{% url gopage %}">{{gopage}}</a></p> <!--ここ-->     
    </body>
</html>

以下のような感じになりました!ボブマーリーっぽいです。。。
スクリーンショット 2019-02-03 1.27.20.png
スクリーンショット 2019-02-03 1.27.30.png

この記事はここまで

続きはこちら→[Python]とにかくわかりやすく!Djangoでアプリ開発!ーその3ー

43
58
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
58