将额外的上下文传递给Django Haystack模板

时间:2012-07-10 20:53:01

标签: django get django-forms django-haystack

使用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源之外,有没有办法以简单的方式完成这个?

4 个答案:

答案 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 }}的身份访问此上下文变量

希望它会有所帮助:)