機能・要件 
 構成・方式 
 タスク 
    事前確認
    プロジェクト作成
    設定ディレクトリ
    アプリケーション
    開発用サーバ
    PostgreSQL
    既存DB統合
    superuser作成
    Apache の使用
    モデルの作成
    モデルの変更
    管理画面の設定
    データの取得
    View の作成
    テンプレート
    ページネーション
    テンプレートタグ
    Staticファイル
    URLconf
    フォーム
    Ajax の使用
    メール送信
    画像アップロード
    匿名セッション
    Cookie
    NEWラベル
    ユーザ登録
    独自ユーザ
    認証
    ゲストとログイン
    サイトマップ

    ショートカット
    template部品化

    既存DB統合
    Pythonシェル
 導入 
 sampleなど

 事前確認
 ・要件定義(例、掲示板)は済
掲示板の要件定義の例など
 ・データ(各モデル)の設計は済
テーブル設計例
 ・アプリケーションの構造設計は済
 ・プログラム構造設計は済
 ・各テンプレートと遷移の設計は済
プログラム構成例
 ・静的ファイルを配信する方法の設計は済
サイトと静的ファイルを同じサーバから配信する場合
専用のサーバ(Apache の機能縮小版など)から静的ファイルを配信する場合
CDNの利用などを利用する場合
 ・以下は、ApachePostgreSQL を用いた掲示板を、リモートアクセスで作成する場合の例

 プロジェクト作成
 ・仮想環境の場合は、 仮想環境(例)に入ってから実施
$ cd venv
$ source bin/activate
 ・プロジェクトを置きたい場所に移動
(venv)$ mkdir "project名" (例、project01)
(venv)$ cd project01
(venv)$ django-admin startproject config . (第2引数はドット)
(venv)$ cd ..
(venv)$ tree "project名"  ディレクトリ構成

 設定ディレクトリの設定
 ・settings.py設定例   ( デフォルト値
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
 ・参考

 アプリケーション(AP)作成
 ・トップレベルモジュールとして base、thread をインポートする場合
 ・プロジェクトのmanage.pyファイルと同じディレクトリに作成
$ cd venv
$ source bin/activate
(venv)$ python3 manage.py startapp base
(venv)$ python3 manage.py startapp thread
(venv)$ cd ..
(venv)$ tree project01
 ・APディレクトリ構成例

 開発用サーバを使用
 ・projicet01 に移動
 ・(venv)$ python3 manage.py runserver
 ・別の端末から確認
$ curl http://127.0.0.1:8000
タイトルに「インストールは成功しました!おめでとうございます!」でOK
外部からの確認では、settings.pyの「ALLOWED_HOSTS = []」の設定要
 ・版数が低く、サーバーの起動などでエラーの場合

 PostgreSQL を使用 (同じホストにインストールの場合)
 ・PostgreSQL 9.3 に対するサポートの終了
リポジトリを確認し、 アップグレードする。
 ・既存のDBを使用する場合
 ・pythonからPostgreSQLに接続するドライバー「psycopg2」をpipコマンドでインストール
 ・仮想環境にインストール
(venv)$ pip install psycopg2-binary
Successfully installed psycopg2-binary-2.9.3
 ・PostgreSQLインストール
インストール、データベース初期化
データベース作成
例、データベース名、db_project01
照合順序などは、template1と同じ
 ・設定項目の確認
./venv/lib/python3.6/site-packages/django/db/backends/postgresql/base.py
 ・settings.py の設定参考     DATABASES = {      'default': {      'ENGINE': 'django.db.backends.postgresql_psycopg2',      'NAME': 'db_mydjango',      'USER': 'xxxxxxxx',      'PASSWORD': 'xxxxxxxx',      'HOST': '127.0.0.1',      'PORT': '5432',      }     }  ・この時点での myDjango/admin のログインでのエラー個所
リレーション"auth_user"は存在しません
 ・新規作成したデータベースにテーブル作成
(venv)$ python manage.py migrate     Operations to perform:      Apply all migrations: admin, auth, contenttypes, 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 auth.0012_alter_user_first_name_max_length... OK      Applying sessions.0001_initial... OK INSTALLED_APPS のアプリのためだけに実行
作成されたテーブルなど

 superuser(管理者ユーザ)作成
 ・作成したプロジェクトの adminサイト にログインできるユーザーを作成
$ python3 manage.py createsuperuser
ユーザー名 (leave blank to use 'django'):
メールアドレス: xxxx@xxxx.xxx
Password:
Password (again):

 既存データベース(PostgreSQL)との統合
 ・データベースへの接続に必要なライブラリをpipでインストール
psycopg2
 ・settings.pyのDATABASESを修正
設定ファイルのDATABASESを編集
 ・マイグレーションで管理用テーブル(名前がauthやdjangoで始まる)作成する。
マイグレーション前
$ python3 manage.py migrate     Operations to perform:      Apply all migrations: admin, auth, contenttypes, sessions     Running migrations:      No migrations to apply. または、      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 auth.0012_alter_user_first_name_max_length... OK      Applying sessions.0001_initial... OK マイグレーション後
 ・superuser(管理者ユーザ)作成
 ・モデルを自動生成
調べた結果を表示
$ python3 manage.py inspectdb
調べた結果を表示し、それぞれのAPのmodels.pyに、出力された文字をコピペする。
デフォルトではinspectdbはアンマネージモデル(managed = False)
Djangoがテーブルのライフサイクルを管理できるようにする場合は、
管理対象オプションをTrueに変更するか削除する。



 ・models.py作成
$ python3 manage.py inspectdb >> models.py (上書きしない場合)
 ・コアDjangoテーブルをインストール
管理者権限やコンテンツタイプなどの追加の必要なDBレコードをインストール
 ・Djangoが生成したモデルを、希望どおりに機能するまで調整する。
DjangoデータベースAPIを介してデータにアクセスし、
Djangoの管理サイトを介してオブジェクトを編集し、それに応じてモデルファイルを編集する。
inspectdb後に、max_length=-1 が設定されていたら、適当な正の整数にする。
 ・python3 manage.py shell などで確認
モデルクラスの app_label が INSTALLED_APPS の中に定義されてないというエラー
モデルクラスの class Meta: に明示的に app_label = 'xxxx'を定義
 ・参考

 Apache を使用
 ・ Apacheを設定
設定し直したらApacheを再起動する。
デーモンモードで使用する。
複数のプロジェクトの場合
wsgi ファイルに書き、必要となる static などの Directory は作成しておく。
 ・ ファイアウォールなどを設定 (CentOS、httpd)
 ・config/settings.py の設定
ALLOWED_HOSTS = [ ] ('*' は全てのホストから)
 ・この時点でのブラウザから、 http://IP//project01/
Using the URLconf defined in config.urls, Django tried these URL patterns, in this order:
1.admin/
The empty path didn’t match any of these.
 ・この時点でのブラウザから、 http://IP//project01/admin にアクセス
 ・ログイン画面からログイン  (Django 管理サイト、ユーザー名:、パスワード:、ログイン釦)     Django 管理サイト       ようこそ django. サイトを表示 / パスワードの変更 / ログアウト     サイト管理       認証と認可       グループ 追加 変更       ユーザー 追加 変更     最近行った操作       自分の操作       利用不可
 モデルの作成変更
 ・モデルを作成(例、 modelSample )又は、models.py の中のモデルを変更する。 (参考
 ・テーブルに沿って作成
作成順序に注意
thread_topic には、thread_category の id が必用
thread_vote には、thread_comment の id が必用
 ・変更のためのマイグレーションファイルの作成
変更を マイグレーション の形で保存する。(例、thread)
APの初期移行などで有効
(venv)$ python manage.py makemigrations thread     python manage.py makemigrations     Migrations for 'thread':      thread/migrations/0001_initial.py      - Create model Category      - Create model Comment      - Create model Vote      - Create model Topic      - Add field topic to comment     (又は、変更の検出なし。)  ・migrate で実行する SQL の確認  (例、thread/migrations/0001)
(venv)$ python manage.py sqlmigrate thread 0001
BEGIN・・・・COMMIT;
sqlmigrate コマンドは確認だけで、マイグレーションを実行しない。
(venv)$ python manage.py check はプロジェクトのチェックを行う。
システムチェックで問題は特定されませんでした。
 ・データベースにモデルの変更を適用
適用されていないすべてマイグレーションを実行
(データベースやテーブルを削除して作り直す必要はない。)
(venv)$ python manage.py migrate     Operations to perform:      Apply all migrations: admin, auth, contenttypes, sessions, thread     Running migrations:      Applying thread.0001_initial... OK      (又は、摘要なし。)  ・PostgreSQL を用いる場合の生成内容など
テーブル名はアプリケーション名とモデルの小文字表記の組合せで自動的に生成
主キー (primary key、ID) は自動的に追加
外部キーリレーションシップは FOREIGN KEY 制約で明確化
データベースに特化した型が自動的に選択され生成
 ・追加されたテーブルなど (PostgreSQL     db_django=# \d (リレーション一覧)     スキーマ |        名前         | 型 | 所有者     -----------+---------------------------------------+--------------+----------      public | thread_category         | テーブル | postgres      public | thread_category_id_seq    | シーケンス | postgres      public | thread_comment         | テーブル | postgres      public | thread_comment_id_seq    | シーケンス | postgres      public | thread_topic            | テーブル | postgres      public | thread_topic_id_seq       | シーケンス | postgres      public | thread_vote            | テーブル | postgres      public | thread_vote_id_seq       | シーケンス | postgres     (27 行)
 管理画面の設定
 ・作成したモデルを管理画面から見えるように設定
 ・当該AP(thread)の admin.py に追記     from django.contrib import admin     from .models import Category, Topic, Comment, Vote     admin.site.register(Category)     admin.site.register(Topic)     admin.site.register(Comment)     admin.site.register(Vote)  ・管理サイトでリレーションを張ったオブジェクトの追加を行う場合、selectボックスが表示
Topic → Category
Vote → Comment
 ・参考

 データの取得
 ・

 View の作成  (MVT_ViewView
 ・base
base/views.py 作成
 ・thread
thread/views.py 作成

 必要となるテンプレートの作成   機能 構成など
 ・APで使用するテンプレート を作成する。
必要なディレクトリを追加
htmlファイルは、とりあえず必要最低限でもよい。
必要となる staticファイルはディレクトリを含め、追加する。
 ・作成したAPで使用するテンプレート

 ページネーション
 ・ページネーションを表示するテンプレート
 ・ページネーションをインクルードするテンプレート
 ・view のパラメータ

 テンプレートタグの追加

 Staticファイル   (静的ファイルをすでにサイトを配信している同じサーバから配信)
 ・ファイルを配置
 ・本番環境へのデプロイ
(venv)$ python manage.py collectstatic
You have requested to collect static files at the destination
location as specified in your settings.
This will overwrite existing files!
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: yes
xxx static files copied to '/xxxx/xxxx/xxxx/static', xxx unmodified.
 ・参考

 URLconf
 ・URLconf (URL configuration)と呼ばれるPythonモジュールを 作成
各urls.pyを作成
 ・ルートの URLconf にAPを反映
config/urls.pyに追加
urlpatternsのリストにinclude()

 フォーム  (構成など
 ・問い合わせフォームの追加
View はFormViewクラス を使用
forms.py は Form 又は ModelForm (thread/forms.py)を使用

 Ajax の使用  (jQueryフレームワーク)
 ・about:blank を用いた js などの確認
 ・ブラウザの機能を用いた確認
Ctrl Shift I

 メール送信
 ・mailx コマンドによるメールサーバの送信確認
localhostのSMTPサーバを利用
 ・トピックが追加された時にメールを送信する処理
 ・settings.py 追加
 ・thread/views.py

 画像アップロード
 ・

 匿名セッション
 ・セッションを使ってトピックを作成

 Cookie データの保存と読出し
 ・セッションを使ってトピックを作成

 NEWラベル
 ・現在時刻との差分を計算してNEWラベルをつける。

 ユーザ登録 機能を追加
 ・accounts AP作成
$ cd venv
$ source bin/activate
(venv)$ python3 manage.py startapp accounts
 ・accounts/urls.py 作成

 独自ユーザ
 ・データベースの初期化  (削除後、データベース作成
$ dropdb db_project01
$ createdb db_project01
 ・独自ユーザモデルをaccounts AP内に作成
 ・独自ユーザ用のフォームを作成
 ・再度新規作成したデータベースにテーブル作成
(venv)$ python manage.py makemigrations
(venv)$ python manage.py migrate
作成されたテーブルなど

 認証



 ・LoginViewによるログイン機能
accounts AP作成
テンプレートがそれぞれのURLで自動的に表示
myap/urls.pyで特にloginやlogoutに関するビューの記述が不要
 ・django.contrib.auth.urlsをインポート
テンプレートがそれぞれのURLで自動的に表示
myap/urls.pyで特にloginやlogoutに関するビューの記述が不要
 ・テンプレート
templates/registration/以下に配置
login.html
logged_out.html
 ・参考

 ゲストとログイン
 ・

 サイトマップ
 ・settings.py 追加
SITE_ID = 1 、追加
 ・DBのマイグレーション
(venv)$ python manage.py migrate     Operations to perform:      Apply all migrations: admin, auth, contenttypes, sessions, thread     Running migrations:      Applying sites.0001_initial... OK      Applying sites.0002_alter_domain_unique... OK  ・sitemaps.py
Sitemap継承クラス
 ・project01/urls.py
追加例Sitemap継承クラス

 ショートカット   ( render()
 ・polls/views.py の index の更新例(関数ベースビュー)   from django.template import loader   from django.http import HttpResponse   from django.shortcuts import render   from .models import Question   def index(request):    latest_question_list = Question.objects.order_by('-pub_date')[:5]    context = {'latest_question_list': latest_question_list}    return render(request, 'polls/index.html', context)  ・get_object_or_404() 関数
Django モデルを第一引数
任意の数のキーワード引数を取り、モデルのマネージャの get() 関数に渡す。
オブジェクトが存在しない場合は Http404 を発生させる。

 template部品化
 ・テンプレートを変更
 ・テンプレート内のハードコードされたURLの削除

 Pythonシェル参考
 ・$ python3 manage.py shell
Python 3.6.8 (default, Nov 16 2020, 16:55:22)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
 ・インポート
>>> from polls.models import Choice, Question (使用モデルのテーブル)
>>> from django.utils import timezone (時間の情報)
 ・中身を確認
>>> Question.objects.all()
<QuerySet []> (何も入っていない場合)
<QuerySet [<Question: What's new?>]>
 ・情報入力
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
(question_textには「What's new?」、pub_dateには現在時刻)
 ・保存
>>> q.save()
 ・確認
>>> q.id
1
>>> q.question_text (question_textの中身)
"What's new?"
>>> q.pub_date (question_textを入れた時刻)
datetime.datetime(2021, 8, 17, 5, 56, 51, 698328, tzinfo=<UTC>
 ・更新
>>> q.question_text = "What's up?" (question_textの中身を「What's up?」にする。)
>>> q.save()
>>> q.question_text
"What's up?"
>>> Question.objects.all() (現在持っている全て)
<QuerySet [<Question: What's up?>]>