开发者

Simple Django Search Form Just Won't Work

I just don't understand what's going on here and I've spent a lot of time attempting to debug this thing (which I took directly from a Django book). The search funcationality actually DID work the first time I loaded the site. I then had to do some debugging to make other pieces work and the search functionality suddenly broke.

When I submit the form, I get 404 telling me that the "story does not exist" although it is in fact in saved in my admin (and therefore my database). 开发者_如何学PythonThe Get query appended to the URL seems right. It concatenates multiple words.

I know that this is so simple and it actually worked before I don't get it. Also interesting, the book that I took this code from didn't include a second Q after the pipe (|). I thought that was a typo and whenever I try to remove it, the whole site fails (including the admin template). That's also strange.

from cms.models import Story, Category
from django.db.models import Q
from django.shortcuts import render_to_response, get_object_or_404

def search(request):
     if 'q' in request.GET:
         term = request.GET['q']
         story_list = Story.objects.filter(
             Q(title__contains=term) | Q(markdown_content__contains=term))
         heading = "Search results"
     return render_to_response("cms/story_list.html", locals())


That is the problem of urlpattern, when the url is http://localhost:8000/cms/search/?q=sec, it will match the urlpattern url(r'^(?P<slug>[-\w]+)/$', 'object_detail', info_dict, name="cms-story"), then the program will find the story whose name like q or whose markdown_content like q, but now your database has not the story, therefore it will tell you "story does not exist", now you can do it like this:

from django.conf.urls.defaults import *
from cms.models import Story

info_dict = {'queryset':Story.objects.all(), 'template_object_name':'story'}

urlpatterns = patterns('cmsproject.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"),
) 


if 'q' in request.GET:
    q = request.GET['q']
    if not q:
        errors.append('Enter a search term.')
    else:
        storylist = Story.objects.filter(title__icontains=q)
        return render_to_response('search_result.html',
           {'packages': packages, 'query': q})
    return render_to_response('cms/story_list.html', {'errors': errors})
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜