3

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'),
...

正常に動作していますが、ログに記録するには検索キーワードをキャプチャする必要があります。

どうすればキャプチャできますか?

あなたの助けをいただければ幸いです。

4

3 に答える 3

7

似たようなことをしたかったので、検索というアプリを作成しました

検索/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'),
    )

検索/urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^search/', 'search.views.search', name="search"),
)

もちろん、プロジェクトの URL に次のルールを追加しました。

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

検索/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)

if 'page' not in request.GET検索結果の最初のページでのみ SearchQuery が保存されるようにする

各 SearchQuery は DB 内で一意です。

SearchTerm の各 SearchQuery は、user(nullable)などの追加情報とともに記録されwhen、用語が検索されました。

view = SearchView()return view(request)SearchQuery が記録された後、そのリクエストに対してデフォルトの干し草スタック ビューが呼び出されるようにします。

于 2013-03-07T02:49:10.783 に答える
5

おそらく最も簡単な解決策は、SearchViewをサブクラス化し、代わりにurlpatternsで使用することです。

Haystack SearchViewは、残念ながら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()
于 2013-03-04T20:05:44.900 に答える
2

Haystack関連saved_searchesのアプリでは、ユーザーの検索履歴を保存できます。

https://github.com/toastdriven/saved_searches

于 2013-03-03T10:41:08.320 に答える