如何在Django中将名为group的可选关键字传递给views.py?

时间:2016-11-20 11:37:31

标签: python django

我正在开发电子商务网站的搜索过滤器。

现状: 当用户选择每个平台过滤器时,平台名称将附加到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)))

1 个答案:

答案 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()