圖書勘誤記錄(非圖靈)《Django Web 開發指南》第8章

惑者發表於2011-12-05

在學習《Django Web 開發指南》這本書上第8章的例子 其它一切都還好,就是遇到個難解的問題 在訪問如:http://localhost:8000/cms/search/?q=2 這樣得地址時,總是出現:

Page not found (404)
Request Method:     GET
Request URL:     http://localhost:8000/cms/search/?q=2

No story found matching the query

專案的 urls.py 如下:

from django.conf.urls import patterns, include, url
from django.contrib import admin

admin.autodiscover()
urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^cms/',include('cms.urls')),
)

app 的 urls.py 如下:

from django.conf.urls.defaults import *
from models import Story
info_dict = { 'queryset': Story.objects.all(), 'template_object_name': 'story' }

urlpatterns = patterns('django.views.generic.list_detail',
    url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
    url(r'^$', 'object_list', info_dict, name="cms-home"),
)

urlpatterns += patterns('cms.views',
    url(r'^category/(?P<slug>[-\w]+)/$', 'category', name="cms-category"),
    url(r'^search/$', 'search', name="cms-search"),
)

對應的 search VIEW 程式碼如下:

def search(request):
    """
    Return a list of stories that match the provided search term
    in either the title or the main content.
    """
    if 'q' in request.GET:
        term = request.GET['q']
        story_list = Story.objects.filter(
            Q(title__contains=term) | Q(markdown_content__contains=term))
        heading = u"搜尋結果"
    return render_to_response("cms/story_list.html", locals())

由於對 Django 的 URL 機制瞭解不深,遇到該問題後一直非常困擾 最後在 search 這個 View 中插入了 assert False 發現頁面沒有如預期那樣出現 assert 頁面 還是之前的頁面,懷疑是 Django 的 URLConf 出了問題,最終在 app 的 urls.py 中找到原因所在:

url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),

這一行的配置覆蓋了其後的:

url(r'^search/$', 'search', name="cms-search"),

如果按照書上(以及叢作者網站下載的程式碼)的寫法,search 這個 View 將永遠無法得到呼叫

將兩組 url 換了一下順序:

from django.conf.urls.defaults import *
from models import Story
info_dict = { 'queryset': Story.objects.all(), 'template_object_name': 'story' }
urlpatterns = patterns('cms.views',
    url(r'^category/(?P<slug>[-\w]+)/$', 'category', name="cms-category"),
    url(r'^search/$', 'search', name="cms-search"),
)

urlpatterns += patterns('django.views.generic.list_detail',
    url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"),
    url(r'^$', 'object_list', info_dict, name="cms-home"),
)

結果正常了。

此外,該書中譯本第148頁程式碼中

search_fields = ('title','content')

應當修改為

search_fields = ('title','markdown_content')

看來原作者和譯者都沒有對書中的程式碼進行嚴格的檢查啊。 順便BS下少數不負責任的圖書出版商。

不過,該章內容中介紹了用 django 搭建支援 markdown 的 CMS 相關內容,還是值得一看。

相關文章