如何向我的模板渲染上下文,我缺少什么

时间:2016-03-11 06:06:46

标签: python django

这似乎很基本,但我不知道为什么它有效。我应该首先提到我正在使用django haystack,我正在尝试将一些上下文(在我的views.py中)发送到具有django haystack的良好功能的模板。

所以在我的views.py

def search(request):
    hotCat = Category.objects.get_hotCat()
    context = {
        'hotCat':hotCat
    }
    return render(request, 'search/search.html',context)

在我的搜索/ search.html中,我做到了 {{hotCat}} 但什么都没有出现。

这里;是我的search.html的完整代码

{% extends 'base.html' %}
{% block head %}
{% load crispy_forms_tags %}

<style>
#div_id_models{
    visibility: hidden;
}

</style>



{% endblock %}
{% block content %}
<div class="col-sm-3">

    <form method="get" action=".">
        <table>
            {{ form|crispy }}
            <tr>
                <td>&nbsp;</td>
                <td>
                    <input type="submit" class="btn btn-default" id="search-button"  style="margin-top:-130px;">
                </td>
            </tr>
        </table>

        {% if query %}

            {% for result in page.object_list %}
                <p>
                    <a href="{{ result.object.get_absolute_url }}">{{ result.object.name }}</a>
                </p>
            {% empty %}
            {% endfor %}

            {% if page.has_previous or page.has_next %}
                <div>
                    {% if page.has_previous %}<a href="/category/{{post.category}}">{% endif %}&laquo; Previous{% if page.has_previous %}</a>{% endif %}
                    |
                    {% if page.has_next %}<a href="/category/{{post.category}}">{% endif %}Next &raquo;{% if page.has_next %}</a>{% endif %}
                </div>
            {% endif %}
        {% else %}
            {# Show some example queries to run, maybe query syntax, something else? #}
        {% endif %}
    </form>
</div>

{{hotCat}}
{%endblock%}

这是因为我正在使用干草堆吗?对于其他模板,这很好用......

编辑我的search_indexes.py看起来像

import datetime
from haystack import indexes
from main.models import Category


class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    content_auto = indexes.EdgeNgramField(model_attr='name')

    def get_model(self):
        return Category

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all()

我尝试添加搜索功能但没有区别

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^activity/', include('actstream.urls')),
    url(r'^select2/', include('django_select2.urls')),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
    url(r'^main/search/',include('haystack.urls')),


    url(r'^accounts/(?P<username>[\.\w-]+)/edit/$',views.profile_edit,
       name='userena_profile_edit'),

    url(r'^accounts/', include('userena.urls')),
    url(r'^', include('main.urls')),



]

1 个答案:

答案 0 :(得分:1)

您尚未将query对象传递给您的模板。 haystack示例继承自SearchView类视图,您已使用基于函数的视图。我猜这是问题所在。

编辑: 这个问题的真正原因是您将urls.py/main/search分到了草堆,因此视图中的search函数没有被调用。 解决方案是使用类似SearchView的内容,并将hotCat值添加到context_dict中。然后将/main/search指向此视图。

例如:

class OwnSearchView(SearchView):

    template='search/search.html',
    form_class=SearchForm

  def get_context_data(self, *args, **kwargs):
      context = super(OwnSearchView, self).get_context_data(*args, **kwargs)
      # do something
      context['hotCat'] = 'hotCat' #get this however you like
      return context

然后在urls.py

url(r'^main/search/', OwnSearchView.as_view(),  name='haystack_search'),

您需要根据代码添加变量值。 Haystack文档提供了有关form_classqueryset

的更多详细信息