Ada*_*ver 3 python django django-haystack
我在url.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'),
...
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我需要捕获搜索关键字来记录它.
我该如何捕捉它?
非常感谢您的帮助.
我想做类似的事情,所以我创建了一个名为search的应用程序
搜索/ models.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'),
)
Run Code Online (Sandbox Code Playgroud)
搜索/ urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
url(r'^search/', 'search.views.search', name="search"),
)
Run Code Online (Sandbox Code Playgroud)
当然,在我的项目网址中,我添加了以下规则:
url(r'^', include('search.urls')),
Run Code Online (Sandbox Code Playgroud)
搜索/ views.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)
Run Code Online (Sandbox Code Playgroud)
if 'page' not in request.GET
这样只有在搜索结果的第一页上才会保存SearchQuery
每个SearchQuery在数据库中都是唯一的.
SearchTerm的每个SearchQuery都会记录其他信息,例如user
(可为空)并when
搜索该术语.
view = SearchView()
并return view(request)
使其在记录SearchQuery之后,为该请求调用默认的haystack视图.
可能最简单的解决方案是将SearchView子类化并在您的urlpatterns中使用它.
不幸的是,Haystack SearchView以不同于Django Class Based Views的方式编写(可能是因为它是在将CBV引入Django之前编写的......),但它是非常简单的代码片段https://github.com/toastdriven/django-草堆/斑点/主/草堆/ 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()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1146 次 |
最近记录: |