2013-01-09 55 views
0

所以我遵循this教程来搜索我的一些模型。但是,对于提供的内容以及作为Django新手的文档缺乏文档,我很困惑为了完成这项工作而缺少什么。在Django应用程序中添加一个简单的搜索

因此,这里是我有:

编辑

修订中,搜索模板,包括输入字段读取查询。

myproject.templates.search.html:

<form action="" method="get"> 
<label for="id_q">Search:</label> 
<input id="id_q" name="q" type="text"> 
<input type="submit" value="Submit"> 

{% if found_entries %} 
    <p>You searched for "{{ query_string }}".</p> 
    <ul> 
     {% for i in found_entries %} 
      {{ i.uid }} {{ i.title }} {{ value|linebreaks }} 
     {% endfor %} 
    </ul> 
{% endif %} 

{% if query_string and not found_entries %} 
    <p>No results found.</p> 
{% else %} 
    <p>Type a search query into the box above, and press "Submit" to search.</p> 
{% endif %} 

</form> 

myapp.models.py:

from django.db import models 

class Book(models.Model): 
    uid = models.IntegerField(primary_key=True) 
    title = models.CharField(max_length=30) 
    class Meta: 
     db_table = u'books' 

myapp.search.py​​:

import re 

from django.db.models import Q 

def normalize_query(query_string, 
       findterms=re.compile(r'"([^"]+)"|(\S+)').findall, 
       normspace=re.compile(r'\s{2,}').sub): 
''' Splits the query string in invidual keywords, getting rid of unecessary spaces 
    and grouping quoted words together. 
    Example: 

    >>> normalize_query(' some random words "with quotes " and spaces') 
    ['some', 'random', 'words', 'with quotes', 'and', 'spaces'] 

''' 
return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] 

def get_query(query_string, search_fields): 
''' Returns a query, that is a combination of Q objects. That combination 
    aims to search keywords within a model by testing the given search fields. 

''' 
query = None # Query to search for every search term   
terms = normalize_query(query_string) 
for term in terms: 
    or_query = None # Query to search for a given term in each field 
    for field_name in search_fields: 
     q = Q(**{"%s__icontains" % field_name: term}) 
     if or_query is None: 
      or_query = q 
     else: 
      or_query = or_query | q 
    if query is None: 
     query = or_query 
    else: 
     query = query & or_query 
return query 

myapp.views.py :

from myapp.models import Book 
from django.shortcuts import render_to_response 
from django.template import RequestContext 

def search(request): 
    query_string = '' 
    found_entries = None 
    search_fields=('uid') 

    if ('q' in request.GET) and request.GET['q'].strip(): 

     query_string = request.GET['q'] 

     entry_query = get_query(query_string, search_fields) 

     found_entries = Book.objects.filter(entry_query) 

     return render_to_response('search.html', 
         { 'query_string': query_string, 'found_entries': found_entries }, 
         context_instance=RequestContext(request)) 

myproject.templates.search.html:

{% if found_entries %} 
    <p>You searched for "{{ query_string }}".</p> 
    <ul> 
    {% for i in found_entries %} 
     <li><a href="{{ q.get_absolute_url }}">{{ found_entries }}</a></li> 
    {% endfor %} 
    </ul> 
{% endif %} 
{% if query_string and not found_entries %} 
    <p>No results found.</p> 
{% else %} 
    <p>Type a search query into the box above, and press "Submit" to search.</p> 
{% endif %} 

myproject.urls.py

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

urlpatterns = patterns('', 
url(r'^predictor/$', 'myapp.views.search'), 
) 

而这里的是什么样子,如果我去:http://localhost:8000/myapp/

图像:http://i.imgur.com/QFaWZ.png

谢谢!

+1

你确切的问题是什么? –

+0

当你做一些像http:// localhost:8000/myapp /?q = word时会发生什么? – JoseP

回答

2

您的模板中没有任何表单:您从未在网页上放置搜索框,为什么要显示?请参考django documentation on using forms


这需要相当数量的工作,但是您并没有使用Django的任何内置机器来创建窗体。这样做会使你的代码更清晰(并且会更容易!)。

1

如果你看看你的代码(我鼓励你这样做),你正在看的视图是myapp.views.search的权利?看看你的搜索函数,你应该能够看到它看起来像request.GET中的'q'键,它等价于从查询字符串中获取'q'元素,所以这就是从中获取搜索的位置。

因此,要搜索,你会去http://localhost:8000/myapp/?q=searchterm其中'searchterm'是指你所搜索的术语。

就像托马斯说的,尽管你可能也想创建一个表单来使用这个功能。

+0

是的,看起来更好,你也可以写一个Django表单来做同样的事情,如果你发现自己重用这个表单,但是你在做的事情看起来很好。 – hkothari

相关问题