インストールとプロジェクトの初期化、アプリの初期化†
インストール†
[local] munakata:~/source/python/vlman$ pip3 install django
[local] munakata:~/source/python/vlman$ python3 -m django --version
2.2.2
PYTHONPATH の指定†
- vscode 上の lint が Django のパッケージが見つけられないというワーニングを出すことを抑止するために明示的に指定
- PYTHONPATH には pip show django を実行して location で指定されたパスを設定する
- PYTHONPATH 自体は vscode の設定ファイル (プロジェクトディレクトリ)/.vscode/settings.json 内に記載するのが良さそう
プロジェクト と アプリ の初期化†
[local] munakata:~/source/python/vlman$ django-admin startproject vlmanui
[local] munakata:~/source/python/vlman/vlmanui$ django-admin startapp file_viewer
管理用ユーザーの登録†
[local] munakata:~/source/python/vlman/vlmanui$ python3 manage.py createsuperuser
Username (leave blank to use 'munakata'):
Email address: magu775@gmail.com
Password:
Password (again):
Superuser created successfully.
timezone とロケールの設定 (settings.py)†
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
インストール完了時のディレクトリー構造†
django ビルトイン管理ツール(= manage.py)†
URL ディスパッチャー(パスコンバーターによるリインテリジェントな URL ルーティング機構)†
path('abc/', include('(プロジェクト名).urls', name = 'reverse serch name')
rpath(r'^abc*$', include('application name.urls'), name='reverse name')
- 正規表現を使ってパス変換する場合には rpath を使うと python の正規表現(re.)の構文が使える
- name で逆引き( URL をハードコードしないで済むように名前で参照させるために必要)
- (プロジェクトルート)/(プロジェクト名)/urls.py <----- 自動で作成される
- (プロジェクトルート)/(アプリケーションルート)/urls.py <----- 手動で作成する必要あり
- 各アプリケーション毎のルーティング(=view との対応関係)
Model (データー構造の定義)†
Django における DB の扱い方(SQL 文は一切使わなくても良い)†
- DjangoではORM(オブジェクト関係マッピング)を使ってデータベースを操作
- DjangoのORMの実装は ActiveRecord パターンを採用
- モデルを設計すればマイグレーション機能でDB定義を自動作成する。
- SQLの記述は不要。モデルマネージャ経由でクエリを実行するとレコードをモデルのインスタンスとして扱える。
- クエリは人間に読みやすく命名されたマネージャメソッドの連鎖として表現する
Django 外で作成した DB を利用するには制約がある場合も†
- DJANGO からデーターベースを操作する場合には、専用に用意された記述を用いる。ほぼ SQL 文を書くことは無い
model と DB の同期処理 (=migration)†
- モデル変更時には以下のコマンドでデータベースに更新を反映する
- python3 manage.py makemigrations (アプリケーション名)
- python3 manage.py migrate
[local] munakata:~/source/python/vlman/vlmanui$ python3 manage.py makemigrations
Migrations for 'fview':
fview/migrations/0001_initial.py
- Create model Filedir
[local] munakata:~/source/python/vlman/vlmanui$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, fview, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying fview.0001_initial... OK
Applying sessions.0001_initial... OK
- migration のリセット
- アプリケーションディレクトリーにある migrations というフォルダーを削除
- キャッシュデータのクリア
(vman) munakata@muna-E450:~/code/python/vman/vmanhmi$ python manage.py shell
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.cache import cache
>>> cache.clear()
- manage.py showmigrations で該当アプリのマイグレーション履歴が消えている事を確認
pylint の Class '(クラス名)' has no 'objects' member エラー対策†
Django キャッシュクリア (データーベース更新時など)†
- from django.core.cache import cache
- cache.clear()
munakata@muna-E450:~/code/python/vman/vmanhmi$ python manage.py shell
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.cache import cache
>>> cache.clear()
View(ビジネスロジックの実装)†
- Djangoのビューは以下の条件を満たす必要がある
- request オブジェクトを(第一引数として)受け取る
- callable であること
- response オブジェクトを返す
- view には各アプリケーション内でデーターベース内のデータの操作(CRUD=新規作成、リード、更新、削除)を行うためのロジック(=関数)を規定する
- python の関数として定義する方法
- python の Class として定義し、(クラス名).as_view() でクラスをビュー関数化する方法 <--- こちらが推奨
Template(Look & Feel の規定)†
bootstrap4 の導入†
munakata@muna-E450:~/code/python/vman/vmanhmi$ pip install django-bootstrap4
Collecting django-bootstrap4
Downloading https://files.pythonhosted.org/packages/02/5a/485d61f6dafa4e4d001a7880b04f40f04fe485a54b2756b0536ed2052342/django-bootstrap4- 0.0.8.tar.gz
Building wheels for collected packages: django-bootstrap4
Running setup.py bdist_wheel for django-bootstrap4 ... done
Stored in directory: /home/munakata/.cache/pip/wheels/f6/58/7f/fcdbcc8c631cc8f775cb8b9349ded99aff7a3f5b28e0f40ef3
Successfully built django-bootstrap4
Installing collected packages: django-bootstrap4
Successfully installed django-bootstrap4-0.0.8
- bootstrap4 ボタン [#tc3adc6f]
choice に対応した専用フォーム(ラジオボタン、ドロップダウンリストなど)†
url タグ(別画面へのリンク)= {% url '{namespace}:{name}' %}†
url タグでページ遷移する時に引数を渡す方法†
<a タグを使って別ページへのリンクを指定するときには view で規定したメソッド名を使う†
画面遷移を伴わない イベントによるデータ操作†
{% csrf_token %} = クロスサイトリクエストフォージェリ(CSRF) 対策†
- POST 処理がエラーとして誤検出されないようにする目的で追加する必要がある
画像の取扱い†
- プロジェクトルートディレクトリに media ディレクトリーを作成
- settings.py に以下の行を追加
# media file for "pillow"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
- ルート URL ルーティングファイル (urls.py) に以下の行を追加
# To support media directory path finding
from . import settings
from django.contrib.staticfiles.urls import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- model に画像を扱うための設定を追加(upload_toを’documents’にしておくことで、/media/documentsに画像が保存される)
class Document(models.Model):
description = models.CharField(max_length=255, blank=True)
photo = models.ImageField(upload_to='documents/', default='defo')
uploaded_at = models.DateTimeField(auto_now_add=True)
ImageField 型を宣言することが重要な意味を持つ
- データが画像データであるかの validity check が行われる
- 更に実際の画像データ(バイナリー)はデーターベースには登録せず、実際のファイルの場所へのリンク情報を登録する
画面分割 = boostrap4 のグリッドシステム†
- container 領域内を水平方向に 12分割 された領域に画面を分解可能 (例. 8 + 4 = 12)

<div class="container">
<div class="row">
<div class="col-lg-8">
<div class="row">
<div class="col-xs-6"></div>
<div class="col-xs-6"></div>
<div class="col-xs-6"></div>
<div class="col-xs-6"></div>
</div>
</div>
<div class="col-lg-4"></div>
</div>
</div>
- インストール
(vman) munakata@muna-E450:~/code/python/vman$ pip3 install django channels channels_redis
- routing.py をプロジェクト直下(アプリの下ではなく)に作成
from channels.routing import ProtocolTypeRouter
application = ProtocolTypeRouter({
# (http->django views is added by default)
})
- setting.py の installed apps に channels を追加
- setting.py に ASGI (=Asynchronous Server Gateway Interface) の起点を登録する。
# websocket (channels) のために ASGIの起点を指定
ASGI_APPLICATION = 'vmanhmi.routing.application'
- runserver 時にASGI が有効になっている事を確認する
System check identified no issues (0 silenced).
July 20, 2019 - 15:43:38
Django version 2.2.2, using settings 'vmanhmi.settings'
Starting ASGI/Channels version 2.2.0 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
vscode を使ったデバッグ†
- vscode 全般の説明は VsCode にまとめている
- vscode を使ってdjango のデバッグができる。
- vscode のデバッガー設定で python django を選択する
- デバッガーの RUN コマンド(緑色の矢印ボタン)でサーバーを起動する (別のターミナルで起動しない)
- ブラウザーでアプリを起動してブレークポイントにヒットすると vscode 画面に切り替わり、変数の内容などが確認できる
参考 URL†