2012-07-10 85 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