解決済みのメモ: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が返せないのでエラーが出るようだ。(言い回しは多分間違ってるけど、そんな風に理解しておいた)
初歩的なミスだったけど、関係が深くわかった気がするので、メモ程度に書き残し。
でうまく行くとこう出来る
ゲストブックの表示はこれでお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 %}