如何使用Haystack添加额外的上下文

时间:2013-03-21 21:15:43

标签: python django django-haystack

我已将Haystack搜索设置到我的网站。搜索工作正常,我真的很喜欢它。我在添加额外的上下文时遇到问题。我想把3个模型中的对象“推”到我的模板。 第一个对象是我的搜索结果,另外两个应该是附加的。我的问题是:如何从其他模型传递对象。这是我的 search_indexes.py 文件:

import datetime
from haystack.indexes import *
from haystack import site
from filmy.models import Video, Page, Category

class VideoIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    title = CharField(model_attr='title')
    description = CharField(model_attr='description')
    date = DateTimeField(model_attr='date')

    def index_queryset(self, using=None):
        # """Used when the entire index for model is updated."""
        return Video.objects.filter(date__lte=datetime.datetime.now())

    def extra_context(self):
        return {
            'categories': Category.objects.all().order_by('-name'),
            'list_of_pages': Page.objects.all().order_by('id'),
        }

site.register(Video, VideoIndex)

搜索工作正常,但我想要列出所有类别和所有页面的列表(我在base.html模板中使用它们。我的解决方案不起作用。我尝试使用子类的第二个:

import datetime
from haystack.indexes import *
from haystack import site
from filmy.models import Video, Page, Category

class VideoIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    title = CharField(model_attr='title')
    description = CharField(model_attr='description')
    date = DateTimeField(model_attr='date')

    def index_queryset(self, using=None):
        # """Used when the entire index for model is updated."""
        return Video.objects.filter(date__lte=datetime.datetime.now())

site.register(Video, VideoIndex)

class VideoSearchIndex(VideoIndex):
    def extra_context(self):
        extra = super(VideoSearchIndex, self).extra_context()
        extra['categories'] = Category.objects.all().order_by('-name')
        extra['list_of_pages'] = Page.objects.all().order_by('id')
        return extra

但是这段代码也行不通。我不知道如何在我的搜索结果中轻松实现其他模型。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。我无法用 extra_context 函数解决它,所以我使用 TEMPLATE_CONTEXT_PROCESSORS 在我的模板中设置全局变量。

这是非常方便的解决方案,因为我不需要在视图中对我的所有模型使用extra_context函数。我只是在一个定义中将全局变量设置在一个文件中。它增加了views.py文件的可读性。