日志Django Haystack搜索关键字

2024-10-02 22:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在我的网址.py公司名称:

from haystack.forms import HighlightedModelSearchForm
from haystack.query import SearchQuerySet
from haystack.views import SearchView
from articles.models import Article

article_sqs = SearchQuerySet().models(Article)

urlpatterns = patterns('',
    ...
    url(r'^article/search/$', SearchView(
        template='articles/search/results.html',
        searchqueryset=article_sqs,
        results_per_page=10,
        form_class=HighlightedModelSearchForm
    ), name='haystack_search'),
...

它工作得很好,但我需要捕获搜索关键字来记录它。在

我怎样才能捕捉到它?在

你的帮助将不胜感激。在


Tags: frompyimportsearchmodelsarticleresultsarticles
3条回答

我想做一些类似的事情,所以我创建了一个名为搜索的应用程序

搜索/模型.py

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _

class SearchTerm(models.Model):
    query = models.CharField(
        verbose_name = _(u'Search Term'),
        max_length = 255,
        default = None
    )

class SearchQuery(models.Model):
    term = models.ForeignKey(
        SearchTerm
    )
    user = models.ForeignKey(
        User,
        blank = True, 
        null = True,
    )
    when = models.DateTimeField(
        verbose_name = _(u'Date Searched'),
    )

搜索/网址.py

^{pr2}$

当然,在我的项目URL中,我添加了以下规则:

url(r'^', include('search.urls')),

搜索/视图.py

from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render, redirect
from haystack.forms import ModelSearchForm, SearchForm
from haystack.views import SearchView
from search.models import SearchQuery, SearchTerm
import datetime

def search(request):
    if 'page' not in request.GET :
        try :
            st, created = SearchTerm.objects.get_or_create(query=request.GET['q'])
            sq = SearchQuery()
            sq.term = st
            sq.user = request.user
            sq.when = datetime.datetime.now()
            sq.save()
        except :
            pass

    view = SearchView()
    return view(request)

if 'page' not in request.GET这样只在搜索结果的第一页上保存搜索查询

每个SearchQuery在数据库中都是唯一的。在

每个SearchTerm的SearchQuery都会记录附加信息,例如user(可为空)和{}搜索到的术语。在

view = SearchView()return view(request)使其在记录搜索查询后,为该请求调用默认的haystack视图。在

可能最简单的解决方案是将SearchView子类化并在urlpatterns中使用它。在

不幸的是,haystacksearchview的编写方式与基于Django类的视图不同(可能是因为它是在CBV引入Django之前编写的),但是它是非常简单的代码https://github.com/toastdriven/django-haystack/blob/master/haystack/views.py#L13

这样的方法应该有效:

class LoggingSearchView(SearchView):

    def create_response(self):
        logger.info(self.query)  #or log self.query as you like
        return super(LoggingSearchView, self).create_response()

与Haystack相关的saved_searches应用程序允许存储用户的搜索历史:

https://github.com/toastdriven/saved_searches

相关问题 更多 >