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

然后用作HTML 中选择器q的值。value<input>

除了编辑 Haystack 源代码之外,还有什么方法可以简单地完成此任务?

4

4 回答 4

9

您可以对 Haystack 视图进行子类化以添加到上下文中:

在您的搜索应用程序中创建一个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不要忘记在 Search 应用程序中更改视图的路径:

from yourSite.apps.search.views import SearchView
于 2012-12-03T10:24:54.723 回答
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
    }

然后,只需调用{{ search_query }}任何 HTML 模板。

于 2012-07-13T23:21:26.483 回答
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')

不需要任何参数。事件

于 2012-11-21T23:21:46.027 回答
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 }}

希望能帮助到你 :)

于 2019-08-27T16:00:23.660 回答