Hatena::ブログ(Diary)

Mattari Memo RSSフィード

2008/12/05

解決済みのメモ:urls.pyにありもしないビュー関数を書くと出てくるエラー

Djangoテンプレートを利用したゲストブックの作成中にこんなものに遭遇

Traceback (most recent call last):

  File "/usr/lib/python2.5/site-packages/django/core/servers/basehttp.py", line 278, in run
    self.result = application(self.environ, self.start_response)

  File "/usr/lib/python2.5/site-packages/django/core/servers/basehttp.py", line 635, in __call__
    return self.application(environ, start_response)

  File "/usr/lib/python2.5/site-packages/django/core/handlers/wsgi.py", line 243, in __call__
    response = middleware_method(request, response)

  File "/usr/lib/python2.5/site-packages/django/middleware/common.py", line 83, in process_response
    if response.status_code == 404:

AttributeError: 'guestbook' object has no attribute 'status_code'

とか出てきた。内容は、guestbookのオブジェクトはstatus_codeの属性を持っていないらしい。これは何で出るかを考えてたんだけど

まずはDjangoで作ってるものの内容としては以下のもの。うまく動いたのをわざとエラーが出るようにしてある。

urls.py
from django.conf.urls.defaults import *

urlpatterns = patterns('mysite.myapp.views',
    (r'^glists/$', 'guestbook'),   #guestbookはviews.pyに無い
    (r'^glists/(?P<guestbook_id>\d+)/$', 'post')
)
views.py
from mysite.myapp.models import guestbook
from django.shortcuts import render_to_response

def glists(request):
	latest_gb_list = guestbook.objects.all().order_by("datetime")[:5]
	return render_to_response("index.html",
				   {"latest_gb_list":latest_gb_list})

このように、urls.pyにありもしないビューを書くと見つからずに、テンプレートで表示させるときにstatus_codeが返せないのでエラーが出るようだ。(言い回しは多分間違ってるけど、そんな風に理解しておいた)

初歩的なミスだったけど、関係が深くわかった気がするので、メモ程度に書き残し。


でうまく行くとこう出来る

f:id:piropati:20081205001940p:image

f:id:piropati:20081205001941p:image

ゲストブックの表示はこれでおk

個別に表示させる場合はfilter()で個別にオブジェクトを引っ張り出すことで実現です。2chにあるレス番表示もこうやってやるんですね。おもしろいなあ

その他のメモとして、order_by()は並べ替えてで、("-hogehoge")とすると降順です。("hogehoge")なら昇順。わかるとシンプルな表現で気に入りました。

views.py
from mysite.myapp.models import guestbook
from django.shortcuts import render_to_response

def glists(request):
	latest_gb_list = guestbook.objects.all().order_by("datetime")[:5]
	return render_to_response("index.html",
				   {"latest_gb_list":latest_gb_list})

def post(request, guestbook_id):
	latest_gb_list = guestbook.objects.all().filter(id = guestbook_id)
	return render_to_response("index.html",
				   {"latest_gb_list":latest_gb_list})
index.html
{% if latest_gb_list %}
    <ul>
    {% for g in latest_gb_list %}
        <li>{{ g.id }} | {{ g.name }} : {{ g.email }} : {{ g.datetime }}</li>
        <ul><li>{{ g.textbody }}</li></ul>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
Connection: close