djangoチュートリアル1 django基本理解編



---

# 1.プロジェクトの作成と起動

```
-----
# プロジェクトの作成
django-admin startproject myblog


# サーバの起動
$ python manage.py runserver

-----
```


# 2.アプリケーション作成

```
# Application definitionの箇所にアプリケーション定義の記述
# hello/apps.py を参考に書く

vi /project/settings.py

# Application definition

INSTALLED_APPS = [
    'hello.apps.HelloConfig',  #<<
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]


# python manage.py startapp hello コマンドを使う

$ cd myblog
$ python manage.py startapp hello


# view.pyの変更

vi hello/view.py

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

def index(request):
    return HttpResponse('Hello World')


# 2.ルーティングするための編集（プロジェクト側urls.py編集）
# myblog/urls.pyを作成する。include, path関数をインポートしpath関数でhelloを指定する。

vi myblog/urls.py

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

urlpatterns = [
    path('hello/', include('hello.urls')),
    path('admin/', admin.site.urls),
]


# myblog/hello/urls.pyを作成する。path関数を指定する。
vi hello/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

# ブラウザから確認を取る。
https://localhost:8000/hello
```




# 3.djangoにテンプレート追加する。


```
# アプリ内views.py にテンプレートを呼び出す処理に変更する
--------------------（変更前）--------------------
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse('Hello World')
--------------------（変更後）--------------------
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return render(request, 'hello/index.html')

# ※renderはデータとテンプレートを組み合わせてwebページを返すショートカット関数

```

# 3-2. テンプレート用ディレクトリ階層とテンプレート用index.html作成

```
pwd
home/myblog/hello


mkdir templates


cd templates
mkdir hello


cd hello
vi index.html
```


```
<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>hello world</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <!-- この下に、htmlタグを追記する -->
        <h1>hello world</h1>
        <p>This is hello</p>
    </body>
</html>
```


# ブラウザから確認を取る。

https://localhost:8000/hello

# 正常にindex.htmlを呼び出せていればテンプレート呼び出しは成功

```



# 4.テンプレートにデータを渡す


```
# アプリhello/views.py からテンプレートにデータを渡せるように変更する
# hello/views.pyの変更

# 
--------------------（変更前）--------------------
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return render(request, 'hello/index.html')
--------------------（変更後）--------------------
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    context = {
       'message': 'Welcome my hello',
       'players': ['勇者', '戦士', '魔法使い']
    }
    return render(request, 'hello/index.html', context)
  # renderの第三引数に、contextという辞書を渡すとテンプレート側で呼び出すことができる。



# テンプレートhello/index.htmlで渡したcontextを受け取る処理が出来るよう変更する

```hello/index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>hello world</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <!-- この下に、htmlタグを追記する -->
        <h1>hello world</h1>
        <p>{{ message }}</p>
        {% for player in players %}
            <p>{{ player }}はモンスターと戦った</p>
        {% endfor %}
    </body>
</html>
```

# ブラウザから確認を取る。

https://localhost:8000/hello

# 正常にindex.htmlへデータを渡せていれば成功
```


---
# 5.djangoのモデルを作ろう


モデルは、データベースのレコードを Pythonのオブジェクトに割り当てる機能。
通常、データベースを操作するにはSQLを使います。SQLは、データベースの操作で標準となる重要な技術ですが、Pythonとは文法や考え方も異なります。
そこで使うのが、モデルというオブジェクトです。モデルは、データベースのレコードをオブジェクトに割り当てます。
モデルを使えば、SQL（エスキューエル）を書かなくても、Pythonのコードでデータベースのレコードをオブジェクトとして操作できできます。
このようにオブジェクトでデータベースを操作するツールを「ORマッパー」(Object-relational mapper)と呼びます。


---
# 5-1. データベースを作成

今回は、本格的なデータベースMySQLを利用する設定にしたいと思います。
(SQLiteをそのまま利用する場合は、このMySQLの設定はスキップできます。)

データベースサーバ(MySQL)はサーバ作成時に設定したので起動していますが、
設定していない場合は、以下のように起動しておきましょう。

```
$ sudo systemctl enable mysql
$ sudo systemctl start mysql
```

ここでは、mysqlコマンドを使って、"mydb"というデータベースを作ります。

以下のようなコマンドを実行しましょう。

```
$ mysql -u root
create database mydb;
```

データベースが作成できました。
次に、アプリケーションでこのデータベースを使うように設定しましょう。


データベースの設定は"mysite/mysite/settings.py"というファイルで行います。
mysite/mysite/settings.py:


```project/settings.py
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
```


---
# 5-3. DBレコードを表すmodelを定義する。


myapp/bbs/models.py

from django.db import models

class Article(models.Model):
    content = models.CharField(max_length=200)

    def __str__(self):
        return self.content


---models.py
from django.db import models

class Diary(models.Model):
    topic = models.CharField(max_length=200)

    def __str__(self):
        return self.topic
---


# 5-3. 作ったmodelによる差分変更の適応

# マイグレーションファイルの作成
python manage.py makemigrations bbs


# マイグレーションの実行
python manage.py migrate


```


# 6. Djangoの管理サイトを使ってみよう


管理サイトは　アプリ・DB・ユーザ情報のための管理機能。django標準で用意。
管理サイトの機能で　DBの追加・変更・削除
そのためにはスーパーユーザの登録（ユーザ名）（メルアド）が必要。


```
# djangoプロジェクトにスーパーユーザ登録する。


python manage.py createsuperuser

: Username: admin
: Email adress: admin@gmail.com
: password: 


# djangoプロジェクトのサーバを起動

$ python manage.py runserver


# ブラウザにて管理サイトにアクセスする。

https://localhost:8000/admin


# 先ほど作成したスーパーユーザの情報でアクセスする。



----
# スーパーユーザの権限の処理を記述するhello/admin.pyを編集


---hello/admin.py
from django.contrib import admin
from .models import Article

admin.site.register(Article)





```









# 7. モデルのデータを一覧表示しよう

hello/views.pyにmodelsからデータを取り出す処理を追記する。

hello/views.py

```hello/views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Article


def index(request):

articles = Article.objects.all()

    context = {
       'message': 'Welcome my hello',
       'articles': artiles,
    }
    return render(request, 'hello/index.html', context)

```


index.htmlにmodelsからデータを取り出す処理を追記する。



```hello/index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>hello world</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <!-- この下に、htmlタグを追記する -->
        <h1>hello world</h1>
        <p>{{ message }}</p>
        {% for article in articles %}
            <p>{{ article.content }}</p>
        {% endfor %}
    </body>
</html>
```

6で登録したＤＢレコードが表示される。





# 8. データの詳細を表示しよう - その1

- 掲示板のルーティング定義

- (ドメイン名)/bbs/ index 一覧表示
- (ドメイン名)/bbs/id detail 個別表示
- (ドメイン名)/admin/ admin.site.urls 管理サイト


- urls.pyに/detailを追加する


myapp/bbs/urls.py

```myapp/bbs/urls.py
from django.urls import path
from . import views

app_name = 'bbs'

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:id>', views.detail, name='detail'),  # 整数型のidがあったら views関数をdetail名を呼び出す
]

```

- views.pyを修正する

動作確認のために、HttpResponseで直接データを表示する。

```myapp/bbs/views.py

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Article

def index(request):
    articles = Article.objects.all()
    context = {
        'message': 'Welcome my BBS',
        'articles': articles,
    }
    return render(request, 'bbs/index.html', context)

def detail(request, id):
    article = get_object_or_404(Article, pk=id)
    return HttpResponse(article)
```


# 9. データの詳細を表示しよう - その2




- views.pyに、detail関数を追加

myapp/bbs/views.py

```myapp/bbs/views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Article

def index(request):
    articles = Article.objects.all()
    context = {
        'message': 'Welcome my BBS',
        'articles': articles,
    }
    return render(request, 'bbs/index.html', context)

def detail(request, id):
    article = get_object_or_404(Article, pk=id)
    context = {
        'message': 'Show Article ' + str(id),
        'article': article,
    }
    return render(request, 'bbs/detail.html', context)
```


- detail.htmlを追加する

myapp/bbs/templates/bbs/detail.html

```
<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>paiza bbs</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <h1>paiza bbs</h1>
        <p>{{ message }}</p>
        <p>{{ article.content }}</p>
        <p><a href="{% url 'bbs:index' %}">一覧</a></p>
    </body>
</html>
```

- 一覧表示から詳細表示にリンク

myapp/bbs/templates/bbs/index.html



{% for article in articles %}
   <p>
       {{ article.content }},
       <a href="{% url 'bbs:detail' article.id %}">詳細</a>
   </p>
{% endfor %}

```hello/index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset='utf-8'>
        <title>hello world</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <!-- この下に、htmlタグを追記する -->
        <h1>hello world</h1>
        <p>{{ message }}</p>
	{% for article in articles %}
   		<p>
       		{{ article.content }},
       		<a href="{% url 'bbs:detail' article.id %}">詳細</a>
   		</p>
	{% endfor %}
    </body>
</html>
```