ホーム >  Python > Django >  投票アプリを作る その1モデルの定義、管理サイトの表示(Django)

投稿日:

投票アプリを作る その1モデルの定義、管理サイトの表示(Django)

DjangoPython

Djangoで簡単な投票アプリを作成します。

投票アプリ

Webサイトのページから投票できる簡単な投票アプリを作成します。今回は、QuestionテーブルとChoiceテーブルを設定しています。

前提

  • 既にDjangoのプロジェクトを作成済み。

仕様

Webページにボタン等のフォームを配置します。ユーザが入力を終え、送信ボタンをクリックしたタイミングでモデル(テーブル)への登録処理を行います。

準備

当サイトでは、Vagrantでゲスト環境(仮想環境)を作ってDjangoを動かいていますが、それ以外の環境でも操作方法はだいたい同じです。

①Djangoプロジェクトを生成します。

VagrantのDjangoで作るWebアプリケーション(その1 プロジェクト生成)

②Djangoアプリケーションを作ります。

VagrantのDjangoで作るWebアプリケーション(その2 プロジェクトの初期設定)

環境

OS CentOS 7.1.1503
pyenv 1.1.3-5-g7dae197
Anaconda 3-4.3.0
MariaDB 5.5.52-1.el7
Apache 2.4.6
mod_wsgi 4.5.14
Django 1.11.3

投票アプリ概要

①以下のようなDjangoアプリ構成を作ります。プロジェクト名が「pj1」で、アプリケーション名が「users」です。プロジェクトの設定は済ませたものとします。赤字のファイルは、今回変更する部分です。

  • pj1/
  • pj1/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • users/
  • __init__.py
  • admin.py
  • apps.py
  • urls.py
  • views.py
  • models.py
  • templates/

アプリケーションの追加

startappでアプリを追加しただけではそのアプリケーションは有効化されません。「pj1/settings.py」の中に使用するアプリ一覧の項目があるので,そこに作成したアプリをINSTALLED_APPSという名前のタプルに追加します。

tutorial/settings.py
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users',  # ← これを追加
)

投票アプリのモデル定義

①投票アプリのモデルを定義します。「users/models.py」に以下の記述をします。

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

ForeignKeyは、他モデルへのリレーションを表現します。カラム型はリレーションを貼ったモデルの主キーと同じ型になり、カラム名はプロパティ名に「_id」が追加されたものになります。今回の例では、question_idという名前のinteger型のカラムが作成されます。(デフォルトの主キーがinteger型のため)

デフォルトではappname_modelnameのテーブルが作成されます。今回の例ではusers_question、 users_choiceのテーブルが作成されます。特別な理由がない限りテーブル名の変更はオススメしません。

以下のようにすれば、テーブル名等を変更できます。

class Question(models.Model):
    class Meta:
        app_label = 'users'
        verbose_name = '質問'
        table_name = 'users_question'

②migrationファイルを作成します。

./manage.py makemigrations

Migrations for 'users':
  users/migrations/0005_auto_20180819_0938.py
    - Create model Choice
    - Create model Question
    - Add field question to choice

③migrateコマンドを実行することでdatabaseに設定が反映されます。

 ./manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, users
Running migrations:
  Applying users.0005_auto_20180819_0938... OK

管理サイトに投票モデル追加

自前のモデル(Choice、Question)を表示させます。

①管理サイトに表示するモデルの設定やカスタマイズは、「app/admin.py」に記述します。今回はチュートリアルにならってusersアプリのQuestionモデルを追加します。

from django.contrib import admin

from .models import Question


admin.site.register(Question)

②簡易サーバを起動します。

python manage.py runserver 0.0.0.0:8000

③以下のURLをブラウザから開いて、Djangoの管理サイトを表示します。

http://localhost:8000/admin/

以下のように「Questions」が表示されます。

※Categorys、Postsなどのモデルは今回追加していません。

④「Questions」→「QUESTIONを追加する」を押すとデータ追加用のフォームが表示されます。以下のようにテストデータを入力して保存します。

⑤以下のような結果が表示されます。登録するとQuestion objectというデータが1つできます。もう一回登録するとQuestion objectが2つ表示されます。

オブジェクト名のカスタマイズ

このままだとなんのデータかわかりません。objectを表す文字列を変更します。

①変更したいモデルの「__str__」メソッド(python2系の場合は__unicode__)をオーバーライドします。

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

以下のように表示が変わります。

②モデル名をカスタマイズします。モデル自体を表す文字列(この場合はQuestion)を変えたい場合は、Metaクラスで設定します。

class Question(models.Model):
    class Meta:
        verbose_name = '質問'
        verbose_name_plural = '質問の複数形'

    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text
verbose_name そのモデルを表す名前。
verbose_name_plural そのモデルの複数形を表す名前を設定。

以下のように表示が変わります。Questionが「質問」、Questionsが「質問の複数形」に変わってるのを確認してください。

トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告