脱職エントリー

いつか退職エントリーを書いて一人前のエンジニアを名乗りたい

Django入門その後に(7)〜Adminサイトを見てみよう〜

ここではDjangoでGUIGUIデータの投入が行えるadminについて見ていこうと思います。

1.その前にスーパーユーザーを作ろう

adminサイトを作る前にスーパーユーザーを作りましょう。
当たり前の話ですがadminサイトが誰からも見えてしまったらセキュリティ上とんでもないことです。
ログインは必須なのでその権限を持ったスーパーユーザーをつくりましょう

$  python manage.py createsuperuser
Username (leave blank to use 'XXXX'): admin
Email address: amind@email.com
Password: minadminad
Password (again): minadminad

こんな風にユーザー名、メールアドレス、パスワード(8文字以上、usernameと似た名前はダメ)を決めると作られます。
もう分かってるかも知れませんが、スーパーユーザーの情報はDjangoで最初にmigrateしたときに自動的に作られたUserテーブルに保存されています。

2.DjangoAdminを書こう

seiyuu_info/info/adminを見てみましょう。

まだこれしか書かれていません

# Register your models here.

さくっとSeiyuuモデルを追加してみましょう。

from django.contrib import admin
from info.models import Seiyuu  # Seiyuuクラスをimportする
# Register your models here.


class SeiyuAdmin(admin.ModelAdmin):  # 声優アドミンのクラスを宣言
    pass

admin.site.register(Seiyuu, SeiyuAdmin)  # 決まった書き方
# 書き方
class [モデル名]Admin(admin.ModelAdmin):  # 
    pass

admin.site.register([モデル名], [上記のクラス名])  # 決まった書き方

Djangoを実行して確認してみよう

$ python manage.py runserver

そして、アドミンサイトに入ってみましょう。

http://127.0.0.1:8000/admin

ログインするとなにか画面ができてますね!

f:id:darakunomiti:20170506022334j:plain

早速Seiyuusの所を押してみましょう

f:id:darakunomiti:20170506023704j:plain

適当に入力してSAVEを押すと一覧にゆきよ様が追加されましたね!
ちなみにこの記事を書いてるときはサカサマのパテマを見てるのですが、普通のヒロイン感あっていいですね。 こういう役もっとやってもいいと思います。
f:id:darakunomiti:20170506023727j:plain

一覧から開くとこんな感じで修正や削除ができます。

f:id:darakunomiti:20170506025228j:plain

後は感覚的にadminサイトを扱えると思います。一旦これでデータをGUIGUI作れるようになりました。
いよいよ。MTVモデルのTとVを一緒に作ろうと思います。次回はちょっと作業が多くて大変かも知れません。

Django入門その後に(8)〜TとVを追加してとにかく動かす〜 - 脱職エントリー

Django入門その後に(6)〜migrateって何〜

今度こそ遂にようやくデータベースに反映しますがその過程について少し細かく書いていこうと思います。

マイグレートに関する3つのコマンド

マイグレートってなんぞ
f:id:darakunomiti:20170506011702j:plain

マイグレーションにはざっくり3つのコマンドがあります。

  • showmigration: 今のデータベースへの反映状態を表示する
  • makemigraiton: models.pyの内容を読んでマイグレーションファイルを作る
  • migrate: マイグレーションファイルの内容をデータベースに反映する

それぞれについて細かく見ていきましょう

①showmigrationで反映状態を確認しよう

$ python manage.py showmigrations とコマンドを打ってみましょう

 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
info
 (no migrations)
sessions
 [X] 0001_initial

多分こんな感じにでてくると思います。
最初にDjangoが標準で作るdjango_migrationsを表示しています。

②makemigration

反映状態を確認したらマイグレーションファイルを作ってみましょう。

Migrations for 'info':
  info/migrations/0001_initial.py
    - Create model Seiyuu

なんかでましたね

ここでもう一度先ほどのコマンドを叩いてみましょう $ python manage.py showmigrations

 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
info
 [ ] 0001_initial ★なんかできてる!
sessions
 [X] 0001_initial

次にフォルダを覗いてみましょう seiyuu_info/info/ f:id:darakunomiti:20170505234128j:plain

0001_initial.pyというのができていますが、これがマイグレーションファイルの実体になります。infoapiには未反映の0001_initialというマイグレートファイルがあるよということですね。
ちなみに反映済みになると先頭の[]が[X]になります

3.migrate

実際に反映するにはmigrateというコマンドを打ちます。

$ python manage.py migrate

  Apply all migrations: admin, auth, contenttypes, info, sessions
Running migrations:
  Applying info.0001_initial... OK

これでデータベースにデータが反映されました。

せっかくなので実際にデータベースを開いて確認してみよう

$ sqlite3 db.sqlite3
sqlite> .schema info_seiyuu
CREATE TABLE "info_seiyuu" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(255) NOT NULL, "gender" integer NULL, "birth_day" date NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

info_seiyuuというTBLが作られています。

  • 名前はSeiyuuではなく [アプリケーション名]_[Djangoに書いたTBL名]で作られますが実際にDjangoで操作するときに意識することはありません。普通にSeiyuuで扱います。
  • IDなんて宣言した覚えがない!→これは定義するときにPKを指定しないとDjango側でIDという名前でPKを自動で作ります。これは大事です。

れで、遂に、やっと、Djangoとデータベースが繋がりました。
ドカベンが柔道から野球を始めるまでに6巻、まどかが魔法少女になるまでに12話掛かりましたが、このチュートリアルは記事6本使って、まだMTVのMしか終わっていませんが一つ一つを丁寧に理解しながら進むことで、色々応用が利くので、ゆっくりと進みましょう。

次回はこれらを登録・更新・削除するadminサイトについて見ていこうと思います。

Django入門その後に(7)〜Adminサイトを見てみよう〜 - 脱職エントリー

Django入門その後に(5)〜モデルを作ろう〜

ここまでDjangoをほとんど書いてなくてジレッタイガーかもしれませんが、一つ一つの手順をじっくり理解しながら進むスタイルですのでご理解ください

余談ですがガラスの艦隊ってアニメは第1話で革命が起きて王制を倒してその革命のリーダーが実は女だったって所まで分かるぐらい20分に詰め込みましたが、2話以降はよく知りません。

1.MTVモデルの復習から

とにかく今回からやっとDjangoの製造にとっかかります。
まずはMTVのM、モデルから行こうと思います。
モデルって何だっけって人のためのイラストを再掲しますとこんな感じです。

MTVモデルについて
f:id:darakunomiti:20170507010044j:plain

要はデータベース部分です。最近はテーブル定義するのにSQL文とか要らないんですよね。Djangoで書いたものを反映してくれます。 すっごーい

2.実際に書いてみよう

今回追加するデータベースはinfoのアプリケーションで使うので/info/models.py に追加します。

from django.db import models  # お決まり


class Seiyuu(models.Model):  # SeiyuuというTableを宣言する、頭文字が大文字が流儀
    """声優さんの一覧"""

    #  性別を選択する選択肢を宣言
    GENDER_CHOICES = (
        (1, '男性'),
        (2, '女性'),
        (3, 'その他'),
    )

    # フィールドを定義します
    # verbose_name:人間に表示する名前を決める、adminサイトとかで使う
    name = models.CharField(max_length=255, verbose_name='名前')  # max_lengthは長さの最大値
    # choicesにタプルを指定することで選択肢のエリアにできる、
    # blankやnullをOKにするかどうか
    gender = models.IntegerField(verbose_name='性別', choices=GENDER_CHOICES, blank=True, null=True)
    birth_day = models.DateField(verbose_name='誕生日', blank=True, null=True)

    created_at = models.DateTimeField(auto_now_add=True)  # レコードが追加された時にその時間を保存します
    updated_at = models.DateTimeField(auto_now=True)  # レコードが更新されたタイミングで現在時間が保存されます。

    def __str__(self):  # クラスを呼び出したときに何が帰るか?(基本何でも良いです)
        return self.name

3. 細かく見てみよう

ここではSeiyuuというTableを宣言しています。

name = models.CharField(max_length=255, verbose_name='名前')

Char型の”名前”という最大255文字のfieldを宣言しています。
verbose_nameというのは人間にも分かる名前を意味しますが、後述するadminサイトで表示するときに「名前」と表示することができます。

choices

性別のように入力項目に制限がある場合は、choicesを使います。
タプルで宣言した項目だけが登録出来るようになります(この場合は1か2)

※タプルというのは、値の中身を絶対に変えられない配列です。丸括弧とカンマ区切りで宣言します。

4.戻り値

これを書いておかないと後述するadminサイトがエラーで表示されません。
とりあえずそのモデルの持つ代表的な項目を返せば良いと思います
あんまりよく分かってないです

書き方
    def __[戻すときの型]__(self):
        return self.戻すfield

    def __str__(self):
        return self.name

書き方のイメージはこんな感じです

[プロジェクトフォルダ]/[アプリケーション名]/models.py

from django.db import models # お決まりの書き方


class [TBL名](models.Model): 

    # フィールドを定義します
   フィールド名 = models.型Field(この中の書き方は色々)
 
    def __[型名]__(self):
        return self.フィールド名

覚えていて欲しいコーディングルールはこんな感じです。

  • TBL名はclass Xxxxで宣言する.
  • TBL名は先頭大文字で単語は複数単語の場合は繋げて書く(例: PrettyRhythm等)

  • field名は小文字で書く

  • field名は単語が複数の時はアンダースコアで繋げて書く(pretty_rhythm等)

ということでいい加減migrate(djangoに書いた定義を実際のデータベースに反映する)をしましょう。

Django入門その後に(6)〜migrateって何〜 - 脱職エントリー

Django入門その後に(4)〜繋がるDB〜

ここではデータベースとDjangoを繋げます。
繋がるストーリー、カラフルストーリーです。(意味不明)

youtu.be

カラフルストーリーのPVは声優系PVとしては珠玉の出来映えです。
10代の素材を損なわない、制服という分かりやすい記号に、2人のダンシングスキルそして、ワンカットPVという努力と工夫の詰まった大変素晴らしいものです。

1.データベースの設定はどこで決める?

データベースへの接続設定はsettinngs.pyに書きます。

settings.py

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

標準ではsqlite3に繋がるようになってます。
sqlite3ってなんだよって人もいると思いますがその謎はすぐに解けます。

2.データベースの設定を実際のデータベースに反映させよう

とりあえず何も考えずにマイグレーション(DjangoとDBを同期させる)という処理をやってみましょう。

$ python manage.py migrate

  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 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 sessions.0001_initial... OK

なんか色々動きましたね!

もう一回フォルダを見てみましょう

├── db.sqlite3: ★なんか出来てる!
├── info
│    (中略)

├── manage.py
└── seiyuu_info
    ├── 中略

db.sqlite3というのがデータベースの実体になります。

3.sqlite3に入って実際に作成されたデータベースを確認してみよう

今回生成されたデータベースの中に入ってみましょう。

sqlite3 [接続先のデータベース]
$  sqlite3 db.sqlite3
SQLite version 3.16.0 2016-11-04 19:09:39
Enter ".help" for usage hints.
sqlite> 
sqlite> 
sqlite> 
sqlite> 
sqlite> .tables  ★このコマンドでテーブルの一覧が見れます
auth_group                  auth_user_user_permissions
auth_group_permissions      django_admin_log          
auth_permission             django_content_type       
auth_user                   django_migrations         
auth_user_groups            django_session            
sqlite> 

先ほどのmigrateというコマンドで色々できました。
じゃこれって何なんだろうというのも絵にしました。

マイグレートについて
f:id:darakunomiti:20170503183007j:plain

ここまでデータベースの定義なんて何一つ書いてませんが、テーブルがいくつかできてますね。
何かというと、Djangoは標準でテーブルをいくつか作ります。例えばセッション管理とかユーザー情報みたいなところを標準で生成します。
うーん、至れり尽くせりですね

次は実際に声優情報のデータベースを追加していきましょう。

Django入門その後に(5)〜モデルを作ろう〜 - 脱職エントリー

Django入門その後に(3)〜MTVモデルって何ですか? 難しいですか? 教えてもらって良いですか?〜

終末何してますか?は見てませんし、内容も全然知りません。ごめんなさい

 MTVモデルって何?

Djangoの基本的な考えにMTVモデルについてです。 公式チュートリアル

中身は貼りませんが、この説明だとまずはMVCモデルが分からないと意味不明じゃないでしょうか
例によって絵を描きますが、深夜テンションで冷静な判断ができないので、アイドルオタクとアイドルを例にした絵を描きました。

MTVモデルって何?
f:id:darakunomiti:20170507005421j:plain

オタクからのコールリクエストに対して写真(データ)をアルバム(Model)から探して、thankyouと書かれたフレーム(template)に詰めてレスポンスすることでオタクをぶち切れさせてるんですね
このアルバムから写真を探してきてフレームに詰めて渡す行為全般が処理(View)になります。
オタクはすぐにぶち切れます。

もうちょっと技術寄りに書くとこんな感じです。

MTVモデルって何?(技術寄りに)
f:id:darakunomiti:20170507010044j:plain

(この例ではwikipediaの表示を例にしていますが、wikipediaDjango製ではありません、分かりやすい例としてwikipediaを出しています。)
ここではwikipedia.org/悠木碧をブラウザから叩くことで、該当の処理(View)が呼ばれてデータベース(Model)から名前や生年月日や出演歴を取得した後にhtmlファイル(template) にその文章や写真を詰めて返しています。templateは表示の部分を司っています。

これを今手元にあるファイルのどこに当てはまるか考えて見ましょう

├── info
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py: ★ここがモデルです。ここにデータベースの定義を書きます
│   ├── tests.py
│   └── views.py: ★ここがViewです。ここに処理を書きます。
├── manage.py
└── seiyuu_info
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-35.pyc
    │   └── settings.cpython-35.pyc
    ├── settings.py ★ここにデータベース接続情報を書きます
    ├── urls.py
    └── wsgi.py

templateがないですね。ここは後で追加します。

ということで、次からはMTVのModelについて見ていこうと思います。

Django入門その後に(4)〜繋がるDB〜 - 脱職エントリー

Django入門その後に(2)〜プロジェクトとアプリケーションを作ろう〜

ここから先は声優情報ポータルサイトを作ることを実例にして進めていこうと思います。

まずはプロジェクトとアプリケーションを作りましょう。

1.そもそもプロジェクトとかアプリケーションって何?

この疑問に対しては公式からの回答があります。
はじめての Django アプリ作成、その 1 | Django documentation | Django

プロジェクトとアプリケーション プロジェクトとアプリケーションの違いとは何でしょうか?アプリケーションとは、実際に何らかの処理を行う Web アプリケーションを指します。例えばブログシステムや公開レコードのデータベース、単純な投票アプリといった具合です。プロジェクトとは、あるウェブサイト向けに設定とアプリケーションを集めたものです。一つのプロジェクトには複数のアプリケーションを入れられ ます。また、一つのアプリケーションは複数のプロジェクトで使えます。

イメージ的にはこんな感じじゃないでしょうか?

プロジェクトとアプリケーション
f:id:darakunomiti:20170503160016j:plain

ざっくり理解したところで次に進みましょう。

2.Djangoのプロジェクトを作ろう

以下のコマンドでプロジェクトが作れます。

書き方: $ django-admin.py startproject [好きなプロジェクト名]
実例: $ django-admin.py startproject seiyuu_info

プロジェクト名は小文字で単語をアンダースコアで繋ぐのが一般的です。

seiyuu_infoフォルダが作られます。 これはプロジェクトを管理するフォルダです。

 manage.py:  超大事だけど直すことはないので気にしない
└── seiyuu_info: フォルダ。プロジェクト名と同じ名前が付く
    ├── __init__.py: 各フォルダにはとりあえずこいつが必要ぐらいの認識でOK
    ├── settings.py: 色々な設定をここに書きます。超大事です。結構直します
    ├── urls.py: 大事です。直します。
    └── wsgi.py: とりあえず気にしない。

3.アプリケーションを追加しよう

書き方: $ python manage.py startapp [アプリケーション名]
実例: $ python manage.py startapp info

ここでは先ほど作ったseiyuu_infoプロジェクトの中にあった manage.pyを叩いてます。
manage.py 呼ぶ処理名 引数Djangoの機能を呼び出しているんですね。

これでinfoというアプリケーションができました。
名前についてはできれば単語一つ、プロジェクト名のように小文字のアンダースコア繋ぎが一般的です。[要出典]

アプリケーションを追加したことでinfoフォルダが増えました。中身を見てみましょう。

│   ├── __init__.py
│   ├── admin.py: データベースの中身を参照したり、更新したりできます。すごいです
│   ├── apps.py: とりあえず今はまだ気にしなくて良いです。django1.8からの機能です。
│   ├── migrations: データベースの変更に関するファイルを持ってます。後で説明します。
│   │   └── __init__.py
│   ├── models.py: データベースの設計を書きます
│   ├── tests.py: 余裕があったら書きます
│   └── views.py: 超大事です。詳しく説明します
├── manage.py
└── seiyuu_info
               省略

4.プロジェクトにアプリケーションを教えて上げよう

Djangoのプロジェクトのsettinngs.pyにinfoアプリを追加します。
settinngs.pyは時々直すので設定関係は全部ここぐらいの認識で良いんじゃないでしょうか?
seiyuu_infoプロジェクトにinfoアプリケーションを使うことを教えます。

seiyuu_info/seiyuu_info/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'info'  # 追加したアプリケーション ←ここを追加
]

これでDjangoのseiyuu_infoプロジェクトとinfoアプリケーションができました。

次はDjangoのMTVモデルについて簡単に説明しようと思います

Django入門その後に(3)〜MTVモデルって何ですか? 難しいですか? 教えてもらって良いですか?〜 - 脱職エントリー

おまけ

アプリケーションの命名規則などについては気になる人はこちらのブログをご参照ください。

ottati.hatenablog.com

Django入門その後に(1)〜始めに〜

Djangoを学習する上での課題色々

Djangoってみなさんどうやって勉強してます?
公式チュートリアルとかQiitaにもDjango入門とかありますけど、その後を補完するまとまった本や記事がないなぁと感じでいます。本も洋書しかありませんし、現状独学でwebアプリを作ろうとしている人にとってDjangoは取っつきにくいフレームワークとなっているように思えます。

Djangoはいいぞ

いいぞといっても筆者はwebフレームワークはDjangoしか使ったことがないので比べることができません。
しかし、Djangoを書く上でのストレスは少ないと感じているので、とっかかりは難しくても一度こつを掴むとさくさく作れるのがDjangoではないでしょうか?

自分は先輩諸兄の手厚い介護の元でDjangoエンジニアっぽいことができていますが、せっかくのGWなので、Django入門のその後のまとまった資料を書いてみようと思います。

なお、アジャイルなエントリーを目指しているので都度都度修正しようと思うので、空中で暴言を言わずに優しくリプを送って頂けると幸いです。

対象

  • webアプリを作りたい人
  • とりあえずDjangoでrunserverできる人(Django入門やチュートリアルが終わっている人)
  • Django入門やってみたけどこの後何ができるかよく分からない人
  • そもそもコピペしたので分かってない人
  • ググっても体系的な記事が出てこなくて困ってる人
  • ざっくり概念を理解したい人
  • サブカルチャーへの造詣と理解がある人

やること

  • Djangoの基本的な仕組みについて少し細かい説明を図やサンプルコードを使って概念を理解することを重点に説明。 (migration、MVCについて、adminサイト、Djangoクエリの取り方色々等々・・)そのため、多少のくどさはあるかも知れませんがご容赦ください。

やらないこと

  • 環境構築
    この話を始めると大変なのでやりません。
    参考までに筆者はこんな感じでやってます
    OS: OSX Sierra
    Python: 3.5.2
    Django: 1.11
    IDE: pycharm(有料版)

  • htmlとかのフロント的なこと
    筆者に力量がなさ過ぎるので説明できませんしません
    とはいえ、templateがあるので素のhtmlで説明しようと思います、フロント的な知識は今回のDjangoの勉強からは外して、なるべくDjangoのみについて学べるようにしようと思います

とうことでプロジェクトを作るところから始めていこうと思います。
またソースコードはこちらに公開しています。

GitHub - NakajimaYuuki/seiyuu_info: Djangoの練習用です。

Django入門その後に(2)〜プロジェクトとアプリケーションを作ろう〜 - 脱職エントリー

おまけ

自分のつたないDjango知識で壮大なことをやろうとしていますが、結果的にDjangoを学ぶ役に立たない物になっても、Djangoの少しまとまった資料がない問題の提起になれば良いかなと思います(逃げ)
オルフェンズも主人公サイドは最後にほぼ壊滅しましたが、それでも火星の人たちの待遇は良くなったのかもしれないねーという、問題提起ぐらいはできたんですし、このDjango入門その後にも鉄火団のように散れれば良いかなと思います。
批判や苦情は優しくお願いします。