DjangoでTODOリストを作ろう(その3)

またまた TODOリスト の続き。

やっとこさリクエストのルーティングとかテンプレートとか。今回は汎用ビューは使わずに、出来るだけベタで書いていこうと思う。

ではさっそく、下ごしらえから。まずはプロジェクトディレクトリにある urls.py を編集する。

from django.conf.urls.defaults import *

# ^todo/の行を追加。
urlpatterns = patterns('',
    (r'^todo/', include('hige.todo.urls')),
    (r'^admin/', include('django.contrib.admin.urls')),
)

これでリクエストURIが /todo/ で始まるものが来たら、 todo なアプリケーションの中にある urls.py を見るようになる。が、 todo なアプリケーションの中を見ても、 urls.py なんて無い。のでコピペとかして作ってしまう。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^list/$', 'hige.todo.views.list'),
    (r'^$', 'hige.todo.views.list'),
)

とりあえずこんな感じ。現状だと /todo//todo/list/ なリクエストが来たら、 todo/views.pylist な関数をキックするようにしてある。

ココから views.py の編集。今回は Django - 0.96から使えるようになった newforms を使ってみたいと思う。コレは近々 forms に名前が変わるので読み込む段階でリネームしておく。

# Create your views here.

from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from django import newforms as forms
from hige.todo.models import Priority, Task


def list(request):
    p = {}
    p['object_list'] = Task.objects.filter(is_active=True)
    return render_to_response('todo/task_list.html', p)

ココで書いた list な関数が /todo//todo/list/ なリクエストが来た時に実際にキックされる事になる。最後の render_to_response でブラウザに返すレスポンスをレンダリングしておしまい。

次に render_to_response の引数で指定している todo/task_list.html を作る。テンプレートの置き場所は settings.pyTEMPLATE_DIRS で指定した場所で、そこを基準として相対的なパスを Django が探してくれる。ので、今回は templates/todo なディレクトリの中に task_list.html を作る。これから何枚かテンプレートを作る事になるので、この段階でテンプレートの継承元も作ってしまっておく。

$ cd /path/to/hige/templates
$ touch base.html # コレが継承元になる。
$ mkdir todo
$ cd ./todo
$ touch task_list.html

まずは継承元の base.html から。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>{% block title %}Untitled{% endblock %}</title>
    </head>
    <body>
        {% block contents %}hello world.{% endblock %}
    </body>
</html>

次に task_list.html の作成。

{% extends "base.html" %}

{% block title %}todo list{% endblock %}

{% block contents %}
<h1>Todo List</h1>
{% if object_list %}
<ul>
    {% for object in object_list %}
    <li>{{ object.priority }}&nbsp;{{ object }}</li>
    {% endfor %}
</ul>
{% else %}
<p>no task.</p>
{% endif %}
{% endblock %}

このテンプレートの継承について。まずは1行目の extends タグで継承元を指定。で、後は親が持っている block タグを必要な所だけ上書きして行く形になっている。何枚でもネストして継承させれるので、 base.html で大枠を作っておいて todo/base.htmltodo アプリ共通部分を書いて todo/task_list.html でメインコンテンツを作成。って事も全然可能っす。親が持ってる隙間に対して穴埋め形式で必要な所を埋めて行く感じ。

これで runserver して http://localhost:8000/todo/ にアクセスすると今作ったTODOリストの一覧画面が出てくるはず。って言っても、まだ何も登録してないので no task. な文字が出るだけなのですが。

管理画面から登録・削除等を行うとちゃんと反映されるので、何か登録して動きを確認してみる。

以下、今回のまとめ?

  • urls.py はアプリケーション毎に用意出来る。(脱カップリング)
  • views.py 等の import はある意味暗記ものかも。
  • テンプレートの継承は慣れてくるとかなり便利。
Posted at: 
2007/06/23 22:36:06
0 Comments
0 TrackBacks
Tags: 
Django
Python
Trackback: 
http://humming.via-kitchen.com/2007/06/23/todo-list-by-using-django-part3/trackback/

TrackBacks

まだ登録されていません。

Comments

まだ登録されていません。

Add Comment

Add Comment