首页 文章

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

提问于
浏览
2

使用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 <input>value 选择器的值 .

除了编辑Haystack源之外,有没有办法以简单的方式完成这个任务?

3 回答

  • 2

    您可以 sub-class Haystack View添加到上下文中:

    在搜索应用中创建 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
    
  • 9

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

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

    不需要任何参数 . 事件

  • 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 }} 即可 .

相关问题