py-py’s blog

何か書くよ

Django Girls Tutorialのまとめ

Django Girl で利用したコマンドを記載

Django Girlsのチュートリアルで書かれているものをざーとまとめる。
読んだらチュートリアルにある簡易アプリを作成→デプロイする、ゴール。

元記事

前提条件

  • Anacondaをインストールしていること

※この記事は書きかけのため、まだ参考にならず。

Django内で利用する言葉について

  • プロジェクト アプリ
  • アプリケーション アプリの機能のこと。これらの集合体がプロジェクト

適当なディレクトリを作成し、そこに移動する。
移動した上で

django-admin startproject <project_name> .

または

django-admin.py startproject <project_name> .

するとディレクトリ構成として以下となる。

user
├── manage.py
└── <project_name>
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

ファイルの簡単な説明として

  • manage.py 管理用スクリプト。Webサーバ立ち上げ等用途は幅広い
  • settings.py 設定ファイル 
  • url.py 取得するurlによってページ遷移するために必要

大元の設定を変更する

<project_name>/settings.pyを変更する

以下を項目を下記に書き換えることで、日本語表示になったりする

LANGUAGE_CODE = 'ja-JP'

TIME_ZONE = 'Asia/Tokyo'

USE_TZ = False

DataBaseの設定

データベースの利用については<project_name>/settings.pyの以下で設定する

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

上記だとsqlite3を利用するとある。
他のデータベースを使いたい場合、ここをmysqlpostgresql等に変更すればよい

データベースのセットアップ

python manage.py migrate

成功した場合、db.sqlite3というフォルダが作られていることを確認

Djangoの内部サーバーを起動

python manage.py runserver

以下にアクセス

http://127.0.0.1:8000/

アプリケーションの作成

python manage.py startapp <application_name>

アプリケーションを作成したらDjangoに認識させる

<project_name>/settings.pyを以下のように書き換える

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    '<application_name>'
)

アプリケーションを作成したら、その都度Djangoに認識してもらうよう
settings.pyのINSTALLED_APPSに追加していく

今後のコードはDjango Girlsのチュートリアルに沿うため、一つ一つ取り上げない。
必要なものはポイントで挙げていく。

Modelについて

動かしたいもの(オブジェクト)とその振る舞い(メソッド)をそれぞれ考える。

本家記事はpostblogとなっているので、オブジェクトは

  • author
  • title
  • text
  • created_date
  • publish_date

となっている。 アプリケーションのモデルについては<application_name>/models.pyを編集する

blog/models.py

from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

class model_name(models.Model)の

models.Modelを継承することでDjangoがデータベースに保存するべきものだということを認識する。

from django.db import models
from django.utils import timezone

class Model_name(models.Model):
    
    # データベースで利用するフィールドを定義

    # def hogehoge():
        #モデルを操作する処理を記載

Modelを作成したら、Djangoに変更を認識させるため、migrationを行う

python manage.py makemigrations <application_name>

※コマンドを打つとエラーが出るが下記を参照し解決できる

https://teratail.com/questions/87245

成功すると

Migrations for '<application_name>':
  0001_initial.py:
  - Create model <model_name>

という表示が出る

Djangoに変更を認識させた後、データベースへ登録する移行ファイルを作成させる

python manage.py migrate <application_name>

今回登録したModelを管理ページでみるために、Django adminを利用する

<application_name>/admin.pyを編集する

from django.contrib import admin
from .models import <model_name>

admin.site.register(<model_name>)

以下のコマンドを実行する

python manage.py runserver

以下にアクセスすると、管理画面にログインするページが表示される

http://127.0.0.1:8000/admin/

管理ページにアクセスするユーザーを作成するため、以下のコマンドを実行する

python manage.py createsuperuser

Herokuへデプロイする

Django Girlsのチュートリアルをそのまま行うとうまくできない。
以下を行うこと。

python -V

バージョン確認する

ディレクトリ内に「runtime.txt」を作成し確認済のバージョンを記入する。

python-<version>

次に以下のコマンドを入力する

pip install --upgrade psycopg2

さらに以下のコマンドを入力する

pip freeze > requirements.txt

次に同じディレクトリに「Procfile」というファイルを作成する。
中身としては以下を記入する。

web: gunicorn <project_name>.wsgi

Heroku上のサーバとローカルとの環境が異なるため、ローカルの環境でも動作できるよう、データベースの設定を保存する。

<project_name>/local_settings.pyを作成する

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

DEBUG = True

プロジェクト大元の設定も変更する
<project_name>/settings.pyを編集する

import dj_database_url
DATABASES['default'] = dj_database_url.config()

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

STATIC_ROOT = 'staticfiles'

DEBUG = False

try:
    from .local_settings import *
except ImportError:
    pass

wsgiファイルの設定変更
<project_name>/wsgi.pyに以下を追加する

from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)