如何在多个应用程序模板中使用Django Haystack Whoosh搜索字段

时间:2019-05-29 18:30:15

标签: python django django-haystack whoosh

我已经按照Mike Hibbert的教程https://www.youtube.com/watch?v=B-n6_m66TmA实现了一个有效的Django 1.6 haystack / whoosh搜索字段。该实现在网址“搜索”中导航栏中的twitter引导搜索字段中起作用。我想在我的应用程序的多个页面中使用该实现,但是它不起作用。

我尝试在其他带有搜索栏的页面中实现search.html代码,但是它将搜索URL前缀从“ search / ...”更改为页面url,例如到首页上的“ front / ...”。我还尝试将search.html包含在其他页面中,作为块内容并在模板中包含include标记,但是它没有用。

# in app/templates/search/indexes/search.html

{% extends 'base_searches.html' %}
{% block content %}

<form method="get" action=".">
    <table>
<tr><th><label for="id_q"></label></th><td><input type="text" id="id_q"
  name="q" placeholder="Search..." class="form-control" /><button 
 class="btn btn-success" type="submit" value="Search"><spaclass="glyphicon
  glyphicon-search"></span></button></td></tr>
        <tr>
            <td>&nbsp;</td>

        {% if query %}

        {% for result in page.object_list %}

        <div class="alert alert-success" role="alert">
          Hi, {{ user }}, here's the found database match for your search 
         <a href="{{ result.object.get_absolute_url }}">
         {{result.object.title }}.</a></div>


        {% empty %}

               <div class="alert alert-info" role="alert">
              <strong>Hi {{ user }}, there's no match found in the 
            database for your search !.</strong>

              </div>
        {% endfor %}

        {% endif %}
        <div class="col-xs-6 col-sm-3 sidebar-offcanvas" id="sidebar">

                 <!--/.sidebar-offcanvas-->
           <!--/row-->

              <hr>

            <td>

            </td>
        </tr>
       </table>
     </form>

    </body>
   </html>

  {% endblock %}

# in models.py for each indexed model field
def get_absolute_url(self):
    return '%s' % self.id


# in app/templates/base_searches.html

<form class="navbar-form navbar-right" id="search">{% csrf_token %}

<center><h> <td colspan="1" id="content">{% block content %}}
 {% endblock %} </center></td></h>

 <ul id="search-results">
    </ul>

  </form>

 in urls.py
 from haystack.query import SearchQuerySet

 url(r'^search/',include('haystack.urls'),name='haystack_search'), 

 # in search_indexes.py

 from haystack import indexes
 from app.models import Article
 class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
       text= indexes.CharField(document=True,use_template=True)
       content = indexes.CharField(model_attr='description')
       content_auto = indexes.EdgeNgramField(model_attr='title')
       def get_model(self):
          return Article
       def index_queryset(self, using=None):
          """used when the entire index for model is updated """

           return self.get_model().objects.all()



# in app/templates/search/indexes/appname/article_text.txt
{{ object.title }}
{{ object.content}}

如何将search.html包含在其他页面中,就像我将它包含在base_searches.html的导航栏中一样,并为搜索结果对象的get_absolut_url函数而不是对get_absolut_url函数保留前缀search / .. searchresult。我尝试将其包含在其中的其他页面的url前缀前/..searchresult?在尝试使用url front /在首页中实现它时,还是有更好的方法在多个应用程序页面的搜索字段中使用干草堆飞快搜索?

1 个答案:

答案 0 :(得分:0)

我已经通过在搜索表单操作中添加http://{{ request.get_host }}/search"来解决了这个问题。

`<form method="get" action="http://{{ request.get_host }}/search"`

动作=“。”将引用您的当前页面,并且该请求将被重定向到您的当前视图。通过将主机URL添加到您的操作中,无论您在哪个页面上,都可以将查询重定向到搜索视图。