Djangoに関してのメモ。
Django全般
・プロジェクトを作成し、次にアプリを作成する流れになる。
・MVCアーキテクチャに基づいて作られている。
⇒Model:データアクセス関係の処理を実施
⇒View:画面表示関係を担当
⇒Controller:全体の制御を担当
インストール、アプリの作成
■Djangoのインストール
>py install django
■プロジェクトを作成・実行
>django-admin startproject django_app←プロジェクト名
若しくは
>py -m django startproject django_app
次に、以下で作成したアプリを実行
>cd django_app
>py manage.py runserver ⇒※ローカルで動作確認
■アプリを作成
ひな形を作成
>py manage.py startapp hello←アプリ名
⇒helloというアプリが追加される。
ファイルをメンテ
※以下、テンプレートを利用したパターンについて記載。
・基本的な流れとして、
① urlpatternsに登録した情報をもとに、どのアドレスにアクセスしたらどの処理(該当アプリのviews.py内に記述された関数の実行)が呼び出されるかが決まる。
② それに基づき、views.pyが実行される。
③ views.pyよりtemplate(htmlファイル)がrenderされる。forms.pyを作成してviews.py側でインポートしてフォームを用いる事も可能。
④ アプリ内にstaticフォルダを作成し、cssファイル等を配置することも可能。
⑤最後に、settings.pyにアプリを登録する。
となる。
①-1. django_appフォルダ内のurls.pyを編集
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
<em>path('admin/', admin.site.urls),
path('hello/', include('hello.urls')),</em>
←path(アクセスするアドレス、呼び出す処理)。例えばimport hello.views as hello, <em>path('hello/', hello.index)とすると、hello/にアクセスすると、hello内のindexを実行する(=helloフォルダ内のview.pyに記述されているindex関数を実行する)となる。</em>
←上記の例でincludeは、include内に記載されたモジュールを読み込む関数。この場合、hello/にアクセスすると、helloフォルダ内のurls.pyが読み込まれる。<em>こうする事で、以降、hello内のアドレスを操作するためにdjango_app内のurls.pyを編集する必要はなくなり、hello内にあるurls.pyが行うことになるので、helloアプリのことは全てhelloの中にあるファイルで完結できるようになる。特に1つのプロジェクトで複数のアプリを作成するケースでは、この形が望ましい模様。</em>
<em>]</em>
<em>from django.contrib import admin
from django.urls import path,include
urlpatterns = [</em>
<em>path('admin/', admin.site.urls),</em>
<em>path('hello/', include('hello.urls')),</em>
←path(アクセスするアドレス、呼び出す処理)。例えばimport hello.views as hello, <em>path('hello/', hello.index)とすると、hello/にアクセスすると、hello内のindexを実行する(=helloフォルダ内のview.pyに記述されているindex関数を実行する)となる。</em>
←上記の例でincludeは、include内に記載されたモジュールを読み込む関数。この場合、hello/にアクセスすると、helloフォルダ内のurls.pyが読み込まれる。<em>こうする事で、以降、hello内のアドレスを操作するためにdjango_app内のurls.pyを編集する必要はなくなり、hello内にあるurls.pyが行うことになるので、helloアプリのことは全てhelloの中にあるファイルで完結できるようになる。特に1つのプロジェクトで複数のアプリを作成するケースでは、この形が望ましい模様。</em>
]
①-2. helloフォルダ内にurls.pyを追加
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),←nameという引数は、このpathにindexという名前を設定している。
]
②-1. helloフォルダ内のviews.pyを編集。URLに応じた関数が呼び出され、それに呼応したテンプレートがレンダーされる流れとなる。
from django.shortcuts import render
def index(request):
return render(request, 'hello/index.html')
※関数内において、msg = request.GET[‘msg’](←パラメータがmsgの場合)にてクエリーパラメーターを取出した上でparamsに入れて、return render(request,テンプレート,params)にてテンプレートにクエリパラメータの値を渡すことも出来る。
②-2. helloフォルダにforms.pyを作成し、クラスにてformを作成。
from .models import Friend, Message
from django import forms
class HelloForm(forms.Form):
name = forms.CharField(label='name')
mail = forms.CharField(label='mail')
age = forms.IntegerField(label='age')
class MessageForm(forms.ModelForm):
# models.pyよりMessageクラスを引用している
class Meta:
model = Message
fields = ['title','content','user']
③helloフォルダ内にtemplatesフォルダを作成し、さらにそこにhelloフォルダを作成。その中にindex.htmlを作成
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>hello</title>
</head>
<body>
<h1>hello/index</h1>
<p>This is sample page.</p>
</body>
</html>
・基本、templatesフォルダは各アプリ配下に作成するが、もしプロジェクトフォルダ直下に配置する場合はsettings.pyを変更する必要がある。⇒参考
④helloフォルダ内に「static/アプリ名」フォルダを作成し、その配下にcssファイル等を作成した上で、templatesのhtmlファイルのheadにおいて、
<link rel="stylesheet" type="text/css" href="{% static 'hello/css/style.css' %}" />
等を追加することで、css等を読み込ます事も出来る。
⑤django_appフォルダ内にあるsettings.pyのINSTALLED_APPSに’hello’,を追加(DBやテンプレート等を使用する場合はアプリの登録が必要になる)
※で動作確認 loalhost:8000/hello
データベースを作成
※DBを利用したアプリ作成の流れは以下のとおり。
①django_appフォルダ内のsettings.pyにあるDATABASE = {}が設定値。sqlite3使用の場合は変更は不要。
②Friendモデルクラスの作成。helloフォルダ内にあるmodels.pyを編集
from django.db import models
class Friend(models.Model):
name = models.CharField(max_length=100)
mail = models.EmailField(max_length=200)
gender = models.BooleanField()
age = models.IntegerField(default=0)
birthday = models.DateField()
def __str__(self):
return '<Friend:id=' + str(self.id) + ', ' + self.name + '(' + str(self.age) + ')>'
③マイグレーションファイルの作成:
django_appにあるhelloアプリに対してマイグレーションを実行する場合は、django_appフォルダに移動してから以下コマンドを実行。
>py manage.py makemigrations hello←マイグレーションを実行するアプリ名
するとhelloフォルダ内にmigrationsフォルダが作成されて、その配下にマイグレーションファイルが作成される。
④マイグレーションの実行:
>py manage.py migrate
上記を実施すると、マイグレーションファイルを適用してデータベースが更新される。
管理者の作成
・マイグレーションを実施した後であれば、以下で管理者が作成できる:
>py manage.py createsuperuser
・管理ツールにログイン(※で動作確認 ) http://localhost:8000/admin
・管理者サイトに作成したモデルを登録するには、各アプリフォルダ内にあるadmin.pyを編集(下記ではFriendモデルを登録する例)
from django.contrib import admin
from .models import Friend
admin.site.register(Friend)
⇒上記を実施すると、admin画面の下部にhelloアプリが表示され、さらにfriendsも表示されるようになる。
⇒admin.pyはアプリ毎にあるので、アプリ毎に、編集対象とするモデルを設定することが出来る。
DBのリセット
・各アプリにあるmigrationsフォルダを削除した後に、db.sqlite3を削除し、あとはmakemigrations, migrate, createsuperuser をすれば良い模様。参考
デプロイ
・nginx + gunicornを用いたデプロイ方法はこれがとても分かりやすい。
・静的ファイルを一か所に集めるには、py manage.py collectstaticを実施。⇒settings.pyの「STATIC_ROOT」で指定された場所に本番環境用の性的ファイルが作られる
その前段で、NGINXの静的ファイルを保存する/usr/share/nginx/htlmlフォルダのオーナを変更しないとパーミッションエラとなるので(参考)、以下を実施。
sudo chown ユーザー名 static
sudo chown ユーザー名 media
・開発サーバ時はrunserverが検索先フォルダからstaticファイル等を上手く参照してくれるが、デプロイする場合はnginx等がその役割を担う為、静的ファイルの設定を適切に行わないとちゃんと表示されない。静的ファイルをどのように処理しているかについてはこのページがとても分かりやすい。
⇒IISの場合はhttps://thinkami.hatenablog.com/entry/2015/12/26/215543#settingspy%E3%81%AE%E8%A8%AD%E5%AE%9A
Tips
・レイアウト用テンプレート
⇒これを用いると、新たなページを、レイアウトの基本配置を維持しながら作ることができる。
・リレーションシップとForeignKey
⇒model.pyで新規モデルをclassで定義する際に、models.ForeingKey(モデル名, xxx)を記述することで、別テーブルの情報とリンケージすることができる。Userモデルを参照する際の注意点はこちら。このページを読むとget_user_model()で呼び出すのが良い模様。
⇒related_name:循環参照エラが出たときに必要となる(参考)
・主にデプロイするとき⇒環境変数 ※参考
- 環境変数は.envに切り出したうえで.gitignoreに.envを記載して管理する。
pip install django-environ
.envには
SECRET_KEY=xxxxxxxxxxxxxxxx ALLOWED_HOSTS=xxx.xxx.xxx.xxx,yourdomain.com
等を記載。
- Djangoの場合、settings.pyにおいてimport environをしたうえで
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))
そのうえで
SECRET_KEY = env('SECRET_KEY')
にて環境変数を取り出す。
・formとmodel(データベース)との関連性
⇒formインスタンスに対して.saveメソッドを実施すると、データベースに保存したModelオブジェクトを返り値として返す(参考)。その際に、.save(commit=False) とするとデーターベースにはまだ反映されないように設定される(参考)。
・OneToOneでフォーム及び2つのモデルを紐づける方法⇒参考
コメントを残す