python – Django – 修改简单搜索结果的外观
发布时间:2020-12-20 11:22:44 所属栏目:Python 来源:网络整理
导读:我正在使用 django迈出第一步,目前我正在尝试使用简单的搜索解决方案为我的网站使用: http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap 这是代码的样子: search.py import refrom django.db.models import Qdef normali
我正在使用
django迈出第一步,目前我正在尝试使用简单的搜索解决方案为我的网站使用:
http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap
这是代码的样子: 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以获得正确的查看结果,你能帮我一点吗? 解决方法
这就是你的问题所在
{% for i in found_entries %} <li><a href="{{ i.get_absolute_url }}">{{i}}</a></li> {% endfor %} 当您只显示{{i}}时,将使用模型的__unicode__方法. 如果您想要显示更多内容,可以使用{{i.category}},{{i.title}}等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |