タイトルの用語とかが正しいのかはたいへん疑問。。。。。。
自分向けの備忘録
目的
Djangoを利用したプログラムを作成する際に、
アプリケーションの規模が大きくなった際に都合が良いように、
ビューやモデルなどのモジュール?を複数ファイルに分割するための手順を整理する。
前提
環境は以下の通り
Ubuntu 16.04
python 3.5.2
django 1.10.5
手順
ここではmodels.pyを複数ファイルに分割してみる。
modelを複数ファイルに分割
__init__.py
admin.py
apps.py
migrations
models.py
tests.py
views.py
ここではmodels.pyを1ファイル=1モデルクラスとできるように修正する。
__init__.py
admin.py
apps.py
migrations
models
__init__.py
task.py
tests.py
views.py
上のコードのようにmodels.pyを削除しmodelsディレクトリを準備し、
その中に__init.py__ファイルとモデルクラスを記述したファイル
(ここでは、task.py)を作成する。
from django.db import models
class Task(models.Model):
"""
Task to do.
"""
name = models.CharField(max_length=30)
startTime = models.DateTimeField()
endTime = models.DateTimeField()
memo = models.CharField(max。_length=200)
from webui.models.task import Task # 上で作成したクラスをインポートする
viewを複数ファイルに分割
ファイルの分割方法は同じ。
- views.pyを削除
- viewsディレクトリを作成
- viewsディレクトリ配下に適当なファイルを作成
- views/__init__.pyファイルを作成
- __init__.pyファイルで3.で作ったファイル内のクラス、メソッドをインポート
__init__.py
admin.py
apps.py
migrations
models
__init__.py
task.py
tests.py
views
__init__.py
task_view.py
urls.pyへの記述
viewモジュールについてはurls.pyへの記述が必要となる
メソッドベースでビューを定義している場合
viewsを複数ファイルに分ける
のようにしている場合は以下の通り
urlpatterns = [
...,
url(r'^適当な正規表現', アプリケーション名.views.ファイル名.メソッド名)
]
from ... importで指定する方法も本項の冒頭に上げたリンク先では
記述しているけれども、同じメソッド名が指定できなくなるので上のコード例を
用いたほうが多分良いと思う。
クラスベースでビューを定義している場合
Django の views.py をクラスにする にあるようにクラス単位の場合は
以下のようになる。
urlpatterns = [
...
url(r'^/URLの正規表現/$', アプリケーション名.views.viewのクラス名.as_view()),
...
]
こちらもメソッドベースの場合と同様にfrom ... importを宣言することで
パッケージ名の記述は不要になるはず。