2012-07-10 87 views
2

使用Django Haystack设置搜索页面涉及放入他们的URL配置段url(r'^search/', include('haystack.urls'))。然而,这意味着(至少从我对Django/MVC非常基本的理解),没有简单的方法来传递额外的上下文(即额外的字典键/值)来呈现到页面上。将额外的上下文传递给Django Haystack模板

特别地,我想自定义一个搜索字段,以反映从GET请求传递到页变量:

<form method="get" action="."> 
<input type="text" name="q" value=""> 
<!-- result html here --> 
</form> 

说出参数?q=twitter附接到URL作为GET请求的一部分;我想让value选择器等于twitter。如果我有看法的控制,我可能会做这样的事情:

if request.method == 'GET': 
    q = request.GET['q'] 
    return render(request, 'template.html', {'q': q}) 

然后用q作为在HTML <input>value选择的值。

除了编辑Haystack源码之外,是否有任何方法可以以简单的方式完成此操作?

回答

2

做到了这一点使用自定义背景处理器:

from django.template import RequestContext 
from django.http import HttpResponse 

def get_search_query(request): 
    search_query = request.GET.get('q', '') 
    print search_query 
    return { 
     'search_query':search_query 
    } 

然后,只需拨打您的任何HTML模板{{ search_query }}

2

干草堆已经通过你的查询。模板变量被称为查询:

<div>Your query was {{ query }}</div> 

如果您仍然需要在上下文中有更多的东西,那么您必须使用basic_search方法。您必须创建您的视图并调用basic_search。所以,在views.py:

from haystack.views import basic_search 

def yourview(request): 
    ... 
    return basic_search(request, extra_context={ 'foo': 'boo', }) 

有更多的参数,你可以在设置的情况下你想:

basic_search(request, template='search/search.html', load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, extra_context=None, results_per_page=None) 

奇怪的是,所有这些都可以直接使用搜索查看()从URL中,除了被称为for extra_context。在urls.py中:

from haystack.views import SearchView 
... 
url(r'^$', SearchViewtemplate='path/to/your/template', load_all=True, form_class='YouForm', searchqueryset=AQuerySet, context_class=RequestContext, results_per_page=10), name='the_name_you_want') 

不需要任何参数。事件

9

您可以子类草堆视图添加到上下文:

创建一个views.py文件搜索应用程序(如果你没有一个)。然后确保您导入Haystack视图。然后,你可以创建一个子类,像这样:

import haystack.views 

class SearchView(haystack.views.SearchView): 
    """ 
    We subclass the base haystack view in order to add context. 
    """ 

    def extra_context(self): 
     return { 
      'yourValue': yourValue, 
     } 

不要忘记改变路径,查看您urls.py,从您的搜索应用中:

from yourSite.apps.search.views import SearchView