詳細ページを作って表示するには

  • models.pyでモデルを作る
  • urls.pyを作る
  • views.pyでビューを作る
  • テンプレを作る
  • Webサーバーを立ち上げる
  • アクセスして確認

くらいの手順が必要。

models.pyでモデルを作る

とりあえずおもむろにmodels.pyを編集。Railsの時と同様にテーブル名にeventを使う

from django.db import models

# Create your models here.
class Event(models.Model):
    name = models.CharField(max_length=100)
    date = models.DateTimeField()

    class Meta:
        db_table = 'event'

コマンドとか無くて、ソースで定義するのは個人的に性に合っている。Railsではモデルを修正したい時に、db/migrate以下のファイルを修正したり、app/models以下のファイルを修正したりで、情報がまとまってなくて困ったけど、Djangoの場合、models.pyを修正すれば事足りるっぽい。Metaクラスでdb_tableってのにテーブル名を指定してやると、指定したテーブル名を使用出来る。指定しない場合、bocho_eventってテーブルにアクセスするっぽい。

フィールドの種類として何が使えるかとかまだまだ勉強中だけど、CharFieldはとりあえず最大文字数(max_length)を指定する必要があることは分かった。指定したくない場合はTextField使えばいいのかな?

urls.pyを作る

Railsでのconfig/routes.rbに当たるのが、urls.py。myproject以下には自動で出来るけど、作ったアプリ(今回はbocho)以下には用意されないので、自分で作って編集する。urlのルーティングは、まずmyproject側で行って、その後、必要な場合にアプリ側のルーティングが行われる。events/show/1でid=1のデータを表示する場合、

myproject/urls.pyは

urlpatterns = patterns('',
    url(r'^events/', include('bocho.urls',namespace='bocho')),
)

と書いて、bocho/urls.pyを

urlpatterns = patterns('',
    url(r'^show/(\d+)/$', views.detail, name="detail"),
)

と書くと、良さげな感じがする。書き方は色々あると思うけど(myproject側をr''みたいにして、bocho側にパターンを全て書いておくとかなんとか)。正規表現の()内はメソッドにパラメータとして渡される。rhacoもそうなので取っ付きやすい。

nameとかnamespaceはviews.pyやテンプレートなどでurlを生成する時に用いる。

{% url 'bocho:detail' 1 %} #テンプレート内
reverse('bocho:detail',args=1) #views内

Railsだと、こういうのどうしたら良いか分からなくて困った。

views.pyでビューを作る

ビューはbocho/views.pyを編集すればおk。詳細表示の場合こんな感じ

# coding: utf-8
from django.shortcuts import render
from bocho.models import Event

def detail(request,event_id):
    event = Event.objects.get(id=event_id)
    return render(request,'event/detail.html',{'object':event})

※ coding: utf-8ってのはpython3では要らないらしい。 modelは先にインポートする。表示に使うテンプレートと変数はview内で指定する。getとかallとかDBにアクセスするためのメソッドはこれから勉強が要るけど、要はDAOなので、それほど苦にはならないっしょ。

テンプレを作る

テンプレを作る前にテンプレのパスに関する設定をする。myproject/settings.pyに次の行を追加

INSTALLED_APPS = (
....
'bocho',
)
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

こうしておくと、bochoアプリのテンプレはbocho/templates/以下を参照し、さらにファイルが無い場合はtemplates/以下も調べる。上のように'event/detail.html'と指定した場合は、bocho/templates/event/detail.htmlを参照する。

設定出来たので、bocho/templates/event/detail.htmlを以下のように書く

<html>
<body>
<h1>詳細画面</h1>
<dl>
    <dt>{{ object.name }}</dt>
    <dd>{{ object.date|date:"Y-m-d" }}</dd>
</dl>
</body>
</html>

フォーマットの方法とか良く分からないので、勉強が必要。dateはこの方法で良さそうだけど、他の場合どうなるんだろ?

Webサーバーを立ち上げる

$ python manage.py runserver xxx.xxx.xx.xx:xxxx

xの部分にIPとポートを入れれば指定したIP、ポートで表示出来る。設定しない場合は知らない。どっかググれば書いてあるはず。あとはxxx.xxx.xx.xx:xxxxにブラウザでアクセスするとページを確認出来るようになる

最初に作る時のコード量はRailsより多いけど、大したことはない。それより、フォルダとファイル構成が分かりやすいので、どこ修正したら良いか分からないなんてことも無いし、Railsより修正がやりやすい気がする。