詳細ページを作って表示するには
- 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より修正がやりやすい気がする。