超初心者用: 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 です。

f:id:kendamaaa:20200424081001j:plain

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つのステップを実行します。

  1. models.py を修正
  2. makemigrations を呼ぶ
  3. 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 もあるはずです。

f:id:kendamaaa:20200424091807j:plain

Admin siteからTopicを追加する

admin site にトピックモデルが追加で来たので、具体的なトピックを追加してみましょう。ここでは、「Chess」と「Rock Climing」を追加します。

f:id:kendamaaa:20200424092407j:plain

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を追加する。

f:id:kendamaaa:20200424094906j:plain

次回

次回は超シンプルなホームページを作ります。