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
以组织我的方面?
答案 0 :(得分:2)
好的,5天后我已经设法搞清楚了。
问题是我希望根据页面显示不同的方面组。
解决方案在于FacetedSearchView
类Haystack的extra_content
方法。在此方法中,定义了extra['facets']
键(dict extra
)。
我唯一要做的就是在我的views
中覆盖此方法,并根据我所在的类别定义一个不同的facet_counts()
组。
所以,代码流是这样的:
extra_content
的{{1}}方法并定义FacetedSearchView
键值。extra['facets'] = self.results.facet_counts()
覆盖了此方法,因此我还声明了views
这是最终值。extra['facets'] = something_else.facet_counts()
被渲染到模板中,我有我想要的东西。
也许这会帮助别人!