使用Django Haystack设置搜索页面需要输入他们的URLconf片段url(r'^search/', include('haystack.urls'))
。但是,这意味着(至少从我对Django / MVC的基本理解),没有简单的方法来传递额外的上下文(即额外的字典键/值)来呈现到页面上。
特别是,我想自定义一个搜索字段来镜像从GET请求传递到页面的变量:
<form method="get" action=".">
<input type="text" name="q" value="">
<!-- result html here -->
</form>
假设参数?q=twitter
作为GET请求的一部分附加到URL;我想让value
选择器等于twitter
。如果我控制了视图,我可能会这样做:
if request.method == 'GET':
q = request.GET['q']
return render(request, 'template.html', {'q': q})
然后使用q
作为HTML value
中<input>
选择器的值。
除了编辑Haystack源之外,有没有办法以简单的方式完成这个?
答案 0 :(得分: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
答案 1 :(得分: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 :(得分:2)
Haystack已经通过了您的查询。模板变量称为查询:
<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)
奇怪的是,除了extra_context之外,所有这些都可以使用url中的SearchView()直接调用。在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')
不需要任何参数。事件
答案 3 :(得分:0)
如果您使用的是基于generic_views的新SearchView,即haystack.generic_views.SearchView
,则需要将其移至get_context_data
函数而不是此处提到的extra_context
https://django-haystack.readthedocs.io/en/v2.4.1/views_and_forms.html#upgrading
示例:在下面,我将拼写建议添加到上下文字典中
from haystack.generic_views import SearchView
# Custom view.
class MySearchView(SearchView):
template_name = 'search/search.html'
queryset = SearchQuerySet().all()
form_class = SearchForm
def get_context_data(self, *args, **kwargs):
context = super(MySearchView, self).get_context_data(*args, **kwargs)
# Add any additional context data we need to display in forms
spell_suggestion = self.get_form().get_suggestion()
context['spell_suggestion'] = spell_suggestion
return context
然后可以在search.html
中以{{ spell_suggestion }}
的身份访问此上下文变量
希望它会有所帮助:)