【问题标题】:django: filtering a object-listdjango:过滤对象列表
【发布时间】:2011-01-10 09:42:16
【问题描述】:

我有一个我要列出的对象列表(在这种情况下是出租物业),该列表需要通过一些标准(最高价格、面积、n_bedrooms ...)进行过滤,我想我可以这样做:

(r'^price:(?P<price_min>\d+)?-(?P<price_max>\d+)?/$', property_list)

这行得通,并允许价格:300-600/ 之类的网址做明智的事情。

但是,当有大约六个属性可以过滤时,它会变得笨拙,理想情况下我想要干净的 url(即不包括我们当前未在 url 中过滤的属性)

在 Django 中是否有一种“标准”的方式来处理这个问题?

【问题讨论】:

    标签: django url filtering


    【解决方案1】:

    在 django 中执行此操作的正确方法是 Alex Gaynor,错误 django-filter by Alex Gaynor

    它允许您以 http get 的形式获取过滤器参数,并根据这些约束过滤您的查询集。

    来自文档:

    import django_filters
    
    class ProductFilterSet(django_filters.FilterSet):
        class Meta:
            model = Product
            fields = ['name', 'price', 'manufacturer']
    

    然后在你看来你可以这样做::

    def product_list(request):
        filterset = ProductFilterSet(request.GET or None)
        return render_to_response('product/product_list.html',
            {'filterset': filterset})
    

    【讨论】:

    • 这会处理过滤,但是(不!)处理我上面提到的混乱部分,通过使用 get-parameters 保持 URLs-clean,这意味着你 do 获取又长又乱的 url。还是我忽略了什么?
    【解决方案2】:

    如果您不需要反转这些 url,您可以使用可选组:

    urls.py:

    #the regex might need some work, it's just a concept
    (r'^(price(/(?P<price_min>\d+))?(/to/(?P<price_max>\d+))?/$ 
    

    views.py:

    def view(request,min_price=None,max_price=None):
        ...
    

    (django_filters 非常好)

    【讨论】:

    • 是的。我考虑了一下,只是想知道是否有更好的方法。我会考虑的,谢谢你的时间!
    猜你喜欢
    • 2015-03-24
    • 2010-11-04
    • 2014-08-22
    • 2018-11-07
    • 2013-08-19
    • 2017-06-14
    • 2017-08-05
    • 2022-01-12
    相关资源
    最近更新 更多