CakePHP使いがDjangoでサイトを作ってみた 〜MVC的な感覚をつかむ〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
僕もすっかりメタボっすわ

この記事を三行にまとめると

基本的な概念はCakePHPと大きくは違わないなと思いました
MTVモデルとでも言うんですかね
JK用語でMTVはメタボのことを言うらしい?
今日はDjangoのファイル構成的な部分を少しだけ突っ込んで見てみたいと思います。

タイトルにもある通り、この記事はCakePHPを使ってた人がDjangoを使った印象に基づくものなので、ある程度CakePHPを知ってるってのが前提の話し方になっちゃいます。そこら辺はご了承ください。

CakePHPを使ったことがある人ならご存じだと思いますが、あのフレームワークはMVCというモデルを採用しています。MVCが何かってのはここでは省略しますが、実はDjangoもそんな感じで役割ごとにファイルが分かれていまして……MVCと呼ぶのかは分からないけど、基本的な概念はCakePHPと大きくは違わないなと僕は思いました。だからCakePHPを使ったことがある人ならDjangoもわりと取っかかりやすいと思います。



基本的なファイル構成

テスト環境構築の際にもやりましたが、Djangoでアプリケーションを作成すると、デフォルトのファイル構成はこんな感じになっています。

/normnois
  ├ /app
  │   ├ /migrations
  │   │   └ __init__.py
  │   │    
  │   ├ __init__.py
  │   ├ admin.py
  │   ├ apps.py
  │   ├ models.py
  │   ├ tests.py
  │   └ views.py  
  │
  ├ /normnois
  │   ├ __init__.py
  │   ├ settings.py
  │   ├ urls.py
  │   └ wsgi.py
  │
  └ manage.py

normnoisとかappとかのフォルダ名はこちらで任意に決めたものなので人によって変わりますが、見てほしいのはappフォルダの中にある「models.py」と「views.py」の二つ。ファイル名から想像がつきそうな感じですが、まさにmodels.pyがモデルでviews.pyがビューのファイルになります。なので、モデルやビューに関するコードをそれぞれのファイルの中に書いてけば良いってことですね。

ただCakePHPとの違いとしては、DjangoのビューはCakePHPで言うとコントローラーに相当します。だからHTMLとかを書くのではなく、モデルに書いた関数を呼び出したりテンプレートに変数を渡したりといった処理を書くことになります。

じゃあCakePHPにおけるビューはどう作るのかと言うと、アプリケーションフォルダの中に「templates」というフォルダを作って、その中にhtmlファイルを置く感じになります。

/app
  ├ /migrations
  │   └ __init__.py
  │    
  ├ __init__.py
  ├ admin.py
  ├ apps.py
  ├ models.py
  ├ tests.py
  ├ views.py
  │    
  └ /templates
      └ index.html

CakePHPもバージョン3になってからテンプレートっていうフォルダの中にテンプレートファイルを置くようになりましたから、感覚的には一緒ですかね。階層を深くすることも可能なので、それこそCakePHPみたくlayoutフォルダとかelementフォルダとかを作ってパーツを分けたりもできます。

設定を変更すればテンプレートの置き場所を他に移すこともできますし、フォルダ名を「templates」以外にすることも可能なようですが、今日はその辺は置いときましょう。なるべく余計な設定をしないようにするなら素直にこの構成にしとくのが良いと思います。



ファイルを複数に分けたい

テンプレートはtemplatesフォルダの下にファイルを作っていけば良いという話でしたが、じゃあモデルやビューは全部models.pyとかviews.pyの一つにまとめてコードを書かなきゃいけないかって言うと、もちろんそんなことはないです。テンプレートと同じように分割できます。

/app
  ├ /migrations
  │   └ __init__.py
  │    
  ├ __init__.py
  ├ admin.py
  ├ apps.py
  │    
  ├ /models
  │   ├ __init__.py
  │   ├ tags.py
  │   └ users.py
  │
  ├ /views
  │   ├ __init__.py
  │   ├ novels.py
  │   └ blog.py
  │    
  └ /templates
      ├ novels.html
      └ /blog
          └ index.html

例えばこんな感じ。モデルやビューを分割する場合はmodels.pyとviews.pyを削除して、代わりに「models」「views」というフォルダを用意します。その中にファイルを入れていく。モデルをデータベースのテーブル単位、ビューをURL単位でファイルを分割したらCakePHPとほぼ同じ構成になりますね。

今回はmodelsとviewsのフォルダの中に「__init__.py」を作りましたが、たぶんなくても正常に動作はすると思います。






CakePHPはモデル、ビュー、コントローラーでMVCという言い方をしていますが、それにてらして考えるとDjangoはモデル、テンプレート、ビューに分割されているので、MTVモデルとでも言うんですかね。JK用語だとMTVはメタボリックシンドロームのことを言うらしいです。俺も今や完全にメタボだからMTVの俺がMTVフレームワークを使っているわけですね。MTVとMTVがかぶってしまったな。

まあ細かい言い方はあれとして、とりあえずCakePHPと同じような感覚で使えるっていうのは何となく伝わったと思います。modelsやviews以外にも任意のフォルダを作ってファイルを読み込んでくることも可能なので、例えばvendorsというフォルダを作ってAPIのライブラリを置いてみる、なんてこともCakePHPの要領でできます。

ビューやモデルのそれぞれの中身については別の機会にもうちょい詳しくやりたいと思います。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください