Help us understand the problem. What is going on with this article?

【Django】アプリケーションの追加手順

More than 1 year has passed since last update.

Djangoフレームワークのプロジェクトに、アプリケーションを追加する手順の一例をまとめました。

前提条件

  • 「urls.pyをアプリケーションごとに配置する」手法を採用しています。

  これは、akiyokoさんの書籍や、下記サイトで紹介されています。

  DJangoメモ:はじめから(URLConfの単純化と分割)

  • 最低限の実装と動作確認を目的とした流れなので、forms.pyやtest.pyの実装は省略しています。

環境

  • Windows10、Python3.7.2
  • 作成済みのプロジェクト直下で、コンソールが起動した状態

1.アプリケーションの雛型を追加

コンソールで、以下のコマンドを実行します。

> python manage.py startapp myappA

プロジェクトフォルダの下に、「myappA」フォルダが作成され、その中に以下のファイルやフォルダが作成されます。

  • migrationsフォルダ
  • __init__.py
  • admin.py
  • apps.py
  • models.py
  • tests.py
  • views.py

2.setting.pyの修正

INSTALLED_APPS定義に、アプリケーション名を追記します。

settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'otherapps',
    'myappA' #←今回追加
]

3.models.pyの定義

データベースのテーブルに該当する、modelの中身を定義します。
ここでは極力シンプルな「人物」モデルを作成しました。

myappA¥models.py
from django.db import models

class Person(models.Model):      # 人物モデル
    class Meta:
        db_table = 'person'

    name = models.CharField(verbose_name='名前', max_length=255)
    age = models.IntegerField(verbose_name='年齢')

    def __str__(self):
        ret = str(self.name) + '(' + str(self.age) + '才)'
        return ret

4.views.pyの定義

ここでは、人物をリスト形式で表示する定義を追加しました。

myappA¥views.py
from django.views.generic import ListView
from . import models

class PersonListView(ListView):
    model = models.Person

5.urls.pyの追加と修正

アプリケーションごとのurls.pyは、「startapp」コマンドでは追加されないため、「myappA」フォルダ内に手動で作成します。

myappA¥urls.py
from django.urls import path
from . import views

app_name = 'person'
urlpatterns = [
    path('', views.PersonListView.as_view())
]

また、myappAの大元のurls.pyに、myappAの定義を追加します。

projectA¥urls.py
from django.contrib import admin
from django.urls import include, path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myappA/', include('myappA.urls')) #今回追加
]

6.apps.pyの確認

次のように自動で定義されていることを確認します。

myappA¥apps.py
from django.apps import AppConfig

class MyappAConfig(AppConfig):
    name = 'myappA'

7.templatesの定義

templatesフォルダの下に「myappA」フォルダを作成し、さらにその中に「person_list.html」を作成します。
(HTMLの名称('_list')については、Djangoの汎用ビュー入門(ListView)などを参照)

person_list.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8"><title>Title</title></head>
<body>
    <p>人物リスト</p>
    <ul>
    {% for item in object_list %}
    <li>{{ item }}</li>
    {% endfor %}
    </ul>
</body>
</html>

8.admin.pyの定義

必須ではありませんが、管理画面にmyappAテーブルを表示するための定義です。

myappA¥admin.py
from django.contrib import admin
from .models import Person

admin.site.register(Person)

9.DBへの反映コマンド実行

詳しい説明は、いまさら振り返る Django Migration(その1)などへ。

> python manage.py makemigrations   #コマンド1
Migrations for 'myappA':
  myappA\migrations\0001_initial.py
    - Create model Person
    - 
> python manage.py migrate myappA   #コマンド2
Operations to perform:
  Apply all migrations: myappA
Running migrations:
  Applying myappA.0001_initial… OK

10.動作検証

> python manage.py runserver   #コマンド3
~省略~
Starting development server at http://127.0.0.1:8000/

ブラウザで上記のメッセージを確認後、管理画面でmyappAのテストデータを登録し、127.0.0.1:8000/myappA/へアクセスします。

result.png
表示されました。

余談

書籍によって、pytyonコマンドが「python3 manage.py ...」と当たり前に記述されていますが、Windows環境で実行する環境によっては「python manage.py ...」となります。
# 自分自身が初っ端ハマって苦労したので、メモ書き

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away