超初心者用: Djangoでウェブアプリを作る ②Appを開始する
前回の続きです。
Appをスタートさせる
Django Projectはそれぞれの機能を持ったappsの集まりです。
現段階では、今回のプロジェクトのほとんどの機能を担う1つのappを作成します。いずれユーザーアカウントを管理するための app も追加します。
ちなみにこの段階では以前起動させたサーバーをストップさせないでください。
新たな terminal を開いて以下を実行してください。この時、manage.py が入っているフォルダに焦点を当ててください。
cd practicing_log
で移動できると思います。
python manage.py startapp practicing_logs
startapp appName でDjangoに app を作るように命令します。今回は practicing_logs という名前にしました。
実行後はpracticing_logs フォルダが追加されているはずです。重要なファイルは、models.py, admin.py, views.py です。
Modelsを定義する
まずはデータについて考えてみましょう。それぞれのユーザーは Practicing_log 内に トピック(topics) を作ります。さらにそれぞれの内容(entry) はトピックに紐づいています。また、それぞれの内容に記入時間を付け加えます。
models.pyを開いてください。
models.py は自動的に追加されたファイルです。そして、独自の models を作ることができます。Model は Djangoに app に保存されてあるデータをどのように使うかを教えます。ちなみに、モデルは Class です。
# manage.py class Topic(models.Model): """ユーザーのトピック""" text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True) def __str__(self): """textを返す.""" return self.text
Model を継承しているTopic という Class を作りました。text と date_added の attributes を持っています。
text の attribute は CharField で、文章によって形成されたデータです。CharField を使うとき、文字数制限をしなければなりません。今回は200文字です。
date_added attribute は DateTimeField で、日にちと時間のデータです。auto_add_now=True は自動的に現時刻をセットするように命令しています。
Djangoに、トピックの情報を表示するとき、デフォルトとしてどの attribute を使うのかを知らせなければなりません。str() は text attribute のデータを返します。
Modelsをアクティベートする
作成したモデルと使うには、プロジェクトに app を追加しなければなりません。setting.pyを開きます。すでに、installed_apps の中にはたくさんの apps がインストールされています。ここに作った app を追加します。下のようになります。
#setting.py --省略-- INSTALLED_APPS = ( --省略-- 'django.contrib.staticfiles', # My apps 'practicing_logs', ) --省略--
practicing_logs を追加しました。
次は、Djangoにデータベースを修正し、トピックのデータも保存できるように命令しなければなりません。terminal から実行してください。
python manage.py makemigrations practicing_logs
makemigrations はデータベースをどのように変更するかを考えるように命令します。裏でいろいろ起こって migration file が作成されます。
これを適応させるために以下を terminal にて実行します。
python manage.py migrate
ちゃんと動けば最終行に、
Applying practicing_logs.0001_initial... OK
と表示されるはずです。
管理するデータを変更するときはいつも、3つのステップを実行します。
- models.py を修正
- makemigrations を呼ぶ
- migrate する
Django Admin Site
app のモデルを定義した時、admin site を使うことで簡単に編集したりすることができます。このサイトは管理者だけがアクセスすることができるため、ほかのユーザーからは見えません。admin site を設定します。
Superuserの設定
Djangoでは特別な権利を持ったユーザーを作ることができます。これを superuser と呼びます。ユーザーの行動を操作したり、制限したりできます。つまり、そのサイトの管理者です。
superuser を作るには、以下を terminal にて実行します。
python manage.py createsuperuser
ユーザー名、メールアドレス、パスワードの設定を要求されます。メールアドレスは省略することができます。これらは admin site に入るために必要になります。
※admin site からパスワードを見ることはできません。ハッシュというものに変換されて保存されます。
ModelをAdmin siteに登録
admin site には User や Group などのモデルが自動的に登録されています。ただ自らが作ったモデルは手動で追加しなければなりません。
models.py と同じ階にある admin.py を開いてください。Topic もでるを登録するには以下のように書きます。
#admin.py from django.contrib import admin #すでにある from practicing_logs.models import Topic admin.site.register(Topic)
まず Topic のモデルをインポートします。そして admin.site.register() を使って admin site に登録します。
今、http://localhost:8000/admin/ にアクセスしてみましょう。/admin/をつけるのを忘れないように! ユーザーネーム、パスワードを入力するとログインすることができます。このページではユーザーを追加したり、編集したりできます。また、Topic もあるはずです。
Admin siteからTopicを追加する
admin site にトピックモデルが追加で来たので、具体的なトピックを追加してみましょう。ここでは、「Chess」と「Rock Climing」を追加します。
Entry Modelを定義する(models.py)
Chess と Rock Climbing についての内容を保存するための Entry モデルを定義します。それぞれの Entry は特定のトピックに結び付いています。この関係性を many-to-one relationship と呼びます。1つのトピックにたくさんの Entry が付くことができる。
Entry モデルを定義します。
#models.py from django.db import models class Topic(models.Model): --省略-- class Entry(models.Model): """特定のトピックに関する内容""" topic = models.ForeignKey(Topic, on_delete=models.PROTECT) text = models.TextField() date_added = models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural = 'entries' def __str__(self): """初めの50文字まで表示""" return self.text[:50] + "..."
Entry クラスも Model を継承します。
topic attribute は ForeignKey で、別のデータベースから参照します。このコードが特定のトピックと結びつけます。それぞれのトピックにKey や ID が生成されます。例えば、Chess は1、Rock Climbing は2。つながりを作るとき、このKeyと結びつけます。
text attribute は TextField で文字列です。ここでは文字制限をしていません。最後は時間です。Topicでも説明したので省略します。
Meta クラスは複数の Entry を参照する必要があるときに Entries を使用するように指示する特別な attribute を設定することができます。
str() は初めの50文字のみを返します。
Entry ModelをMigrateする
新しいモデルを追加したので、データベースに反映しなければなりません。この工程は2度目になります。
以下を terminal でそれぞれ実行します。
python manage.py makemigrations practicing_logs python manage.py migrate
0002_entry.py が生成されるはずです。
Entry ModelをAdmin siteに登録
# admin.py from django.contrib import admin from practicing_logs.models import Topic, Entry #<-ここ admin.site.register(Topic) admin.site.register(Entry) #<-ここ
もう一度 admin site に行って確認してみてください。追加されているはずです。
EntryからそれぞれのTopicを選び、Entryを追加する。
次回
次回は超シンプルなホームページを作ります。