2012-01-06 24 views
3

我正在做我的Django的第一個步驟,此刻我嘗試將簡單的搜索解決方案,使用我的網站:http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snapDjango的 - 修改簡單搜索一下結果

這是代碼的樣子:

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 

views.py

from news.models import * 
from news.search import * 
from django.shortcuts import render_to_response 
from django.template import RequestContext 

def search(request): 
query_string = '' 
found_entries = None 
search_fields=('text','title',) 

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 = News.objects.filter(entry_query).order_by('-id') 

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

models.py

STATUS_CHOICES = (
       ('d', 'Draft'), 
       ('p', 'Published'), 
       ('w', 'Withdrawn'), 
) 

class News(models.Model): 


category = models.ManyToManyField(Category, verbose_name='Kategorie') 
title = models.CharField(max_length=255, verbose_name='Tytuł') 
slug = models.SlugField(max_length=255, unique=True, verbose_name='Odnośnik') 
text = models.TextField(verbose_name='Treść') 
date = models.DateTimeField(verbose_name='Data dodania') 
author = models.ForeignKey(User, verbose_name='Autor') 
status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='d') 


class Meta: 
    verbose_name = "Wiadomość" 
    verbose_name_plural = "Wiadomość" 


def __str__(self): 
    return self.title 
def __unicode__(self): 
    return self.title 
def get_absolute_url(self): 
    return '/news/' + self.slug + '/' 

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 %} 

什麼即時試圖做的是讓搜索結果的適當觀察(通過新聞模型搜索,這應該返回車道的標題+情侶文字也許?)這是它看起來像atm:http://dl.dropbox.com/u/26827941/ScreenShot108.png(我不允許張貼圖像)

花了我至少花了幾個小時,試圖找到一個合適的解決方案,我應該如何修改我的views.py和search.html爲了得到正確的視圖結果,你能幫忙嗎?請稍等?

回答

7

這是你的問題是

   {% for i in found_entries %} 
        <li><a href="{{ i.get_absolute_url }}">{{i}}</a></li> 
       {% endfor %} 

如果只是展示{{i}},則使用模型的__unicode__方法。

如果你想顯示更多,你可以使用{{i.category}}{{i.title}}

+0

哦的人...我簡直不敢相信它,非常感謝! #i甚至不能upvote你:( – mymlyn 2012-01-06 16:55:36