我正在开发电子商务网站的搜索过滤器。
现状: 当用户选择每个平台过滤器时,平台名称将附加到URL并显示过滤结果。
我的方法:
url.py
url(r'^search/(?P<product_slug>[0-9a-z-]+)$', CustomSearchView(), name='search_result_detail'),enter code here
url(r'^search/(?P<product_slug>[0-9a-z-]+)_(?P<platform_slug>[0-9a-z-]+)$', CustomSearchView(),
name='search_result_platform'),
url(r'^search/(?P<product_slug>[0-9a-z-]+)_(?P<platform_slug>[0-9a-z-]+)_(?P<platform_slug2>[0-9a-z-]+)$',
CustomSearchView(), name='search_result_platform2'),
url(r'^search/(?P<product_slug>[0-9a-z-]+)_(?P<platform_slug>[0-9a-z-]+)_'
r'(?P<platform_slug2>[0-9a-z-]+)_(?P<platform_slug3>[0-9a-z-]+)$',
CustomSearchView(), name='search_result_platform3'),
主要问题: 我不想限制过滤次数。因此,如果有20个平台过滤器,我需要创建20个URL。绝对不是一个聪明的方式。还有其他任何避免创建一批URL的智能方法吗?
views.py
def __call__(self, request, product_slug, platform_slug=None,platform_slug2=None,platform_slug3 = None
,platform_slug4 = None,platform_slug5 = None):
if platform_slug is None:
self.product_review_list = SearchResult.objects.filter(products__slug=product_slug)
else:
self.product_review_list = SearchResult.objects.filter(Q(products__slug=product_slug),
Q(platform__slug=platform_slug)|(Q(platform__slug=platform_slug2)|Q(platform__slug=platform_slug3)
|Q(platform__slug=platform_slug4)|Q(platform__slug=platform_slug5)))
答案 0 :(得分:0)
正如评论中所提到的,这种过滤是GET参数的工作,而不是路径。
网址格式应为r'^search/$'
,您可以通过/search/?platform_slug=x&platform_slug=y&platform_slug=z
调用它。然后,在视图中,您只需使用__in
过滤:
def custom_search_view(request):
product_review_list = SearchResult.objects.filter(products__slug__in=request.GET.getlist('platform_slug')
另一点。您必须绝对不在您的网址中使用此类,然后在self
上设置属性。这不是线程安全的,会导致各种各样的问题。如果您确实需要使用类,请将通用View类子类化并在URL中将其用作CustomSearchView.as_view()
,然后覆盖get()
或post()
。