不同的SearchQuerySet取决于页面

时间:2014-12-28 19:49:39

标签: django django-haystack faceted-search

StackOverflow帮助我完成了以下项目。但是,我陷入了困境 - > Haystack Facets!我已经阅读了几十个问题 - 答案,但没有一个能满足我的要求。
我正在使用Django建立一个销售珠宝,小雕像,艺术品等的电子商店。我还使用django-mptt片段来组织我的类别。 我想要的(仅用于facet实现)类似于this。因此,取决于所选择的类别,不同的方面。我得出结论,为了实现这一点,我必须在MyFacetedSearchView' s __init__中设置不同的SearchQuerySet,具体取决于用户点击的类别。我怎样才能做到这一点?我错了吗?
我的档案:

#search_indexes.py

from haystack import indexes

from .models import Product

class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    creator = indexes.CharField(model_attr='creator', faceted=True)
    material = indexes.CharField(model_attr='material', null=True, faceted=True)
    category = indexes.MultiValueField(faceted=True)
    sizevenus = indexes.MultiValueField(null=True, faceted=True)

def get_model(self):
    return Product

def prepare_category(self, obj):
    """
    Prepares the categories for indexing.
    obj.categories.all() runs for each Product instance.
    Thus, if we have 10 products then this method will run 10 times (during rebuild_index or update_index command)
    creating each time a different list for the categories each product belongs to.
    """
    return [category.slug for category in obj.categories.all()]

def prepare_sizevenus(self, obj):
    """
    Same philosophy applies here for the size of the product. But this time we have explicitly told that
    we want the size for the VENUS products ONLY. The rest of the products of this e-shop have no sizes!
    """
    return [stock.size.name for stock in obj.productstock_set.filter(product__categories__slug='venus')]

def index_queryset(self, using=None):
    """
    This method defines the content of the QuerySet that will be indexed. It returns a list of Product instances
    where each one will be used for the prepare_***** methods above.
    """
    return self.get_model().objects.all()

#views.py

class ShowProductsByCategory(FacetedSearchView):
    def __init__(self):
    sqs = SearchQuerySet().facet('category').facet('creator').facet('sizevenus').facet('
    template = 'catalog/show_products_by.html'
    form_class = MyFacetedSearchForm
    super(ShowProductsByCategory, self).__init__(template=template, searchqueryset=sqs, form_class=form_class)


问题:
初始化ShowProductsByCategory视图时,它获取整个sqs。然后在我的所有页面(珠宝,陶瓷,雕像等)中,小平面显示整个目录中的产品,而不是我所在的特定类别,即在珠宝页面中显示所有与珠宝相关的产品,但是在方面(通过创造者)div,它显示了一个创造了一个珠宝的创造者A和一个没有(但是B已经建造了说,雕像)的创造者B. 我怎样才能每次传递不同的SearchQuerySet以组织我的方面?

1 个答案:

答案 0 :(得分:2)

好的,5天后我已经设法搞清楚了。 问题是我希望根据页面显示不同的方面组。
解决方案在于FacetedSearchView类Haystack的extra_content方法。在此方法中,定义了extra['facets']键(dict extra)。
我唯一要做的就是在我的views中覆盖此方法,并根据我所在的类别定义一个不同的facet_counts()组。

所以,代码流是这样的:

  1. 首先,调用extra_content的{​​{1}}方法并定义FacetedSearchView键值。
  2. 由于我的extra['facets'] = self.results.facet_counts()覆盖了此方法,因此我还声明了views这是最终值。
  3. 最后,我的extra['facets'] = something_else.facet_counts()被渲染到模板中,我有我想要的东西。
  4. 也许这会帮助别人!