2012-04-09 78 views
1

我在做这将从查询集来显示对象列表的通用模板:在Django中基于捕获的URL参数过滤QuerySet?

{% for o in objects %} 
    {{ o.name }} 
{% endfor %} 

我希望能够使用在多个场合,模板,其中不同类型的过滤和排序需要做完了。我创建了一个视图功能是:

def display_objects(request, filters, orders, template_name): 
    objects = Object.objects.all() 
    for filter in filters: 
     objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), filter['value'])) 
    for order in orders: 
     objects = objects.order_by('-' if 'descending' in order else '' + order['field']) 
    # render objects to template with context 
    pass 

我不知道如果我做了什么至今仍然工作,但我碰到的一个问题。我不知道用当前函数过滤URL中捕获的参数设置的查询是否可行。

例如,如果我想显示与特定的用户我会做一些这样的对象:

(r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact','value':account_username}], orders=[{'field':'foobar'}], template_name='user.html')) 

显然,account_username是不是一个定义的字段,直到URL被解析并分发到display_objects功能。制作一个带有account_username参数的视图函数会很容易,但我希望能够使用该函数来显示其他对象查询集,这些查询集将用不同的捕获参数进行过滤。

是否有某种方法可以将捕获的URL参数传递给视图函数来动态地过滤或排序查询集以显示?

回答

1

这里是你可以做到这一点的一种方法:

在urls.py

(r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact'}], orders=[{'field':'foobar'}], template_name='user.html')) 

然后在views.py:

def display_objects(request, filters, orders, template_name, **kwargs): 

    objects = Object.objects.all() 
    for filter in filters: 
     objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), kwargs.get(filter['field']))) 
    for order in orders: 
     objects = objects.order_by('-' if 'descending' in order else '' + order['field']) 
    # render objects to template with context 
    pass 

虽然老实说,我不知道是否这是做事情的好方法...

+0

正如我想到的那样,我意识到,我构建视图函数的方式可能不是最优的。对于如何动态过滤并为模板排序查询集,您有任何建议吗? – mburke13 2012-04-09 22:52:45

0

您不能直接将字符串传递给filter方法。你需要把它翻译成kwargs。

query_string = '%s__%s' % (filter['field'], filter['relationship']) 
objects = objects.filter(**{query_string: filter['value']})) 
+0

我不知道什么时候发生这种情况,但他的语法在1.4A'obj.filter(('key','value'))''上工作。我也抓住了我的警惕,但它接受了键/值元组。 !? – 2012-04-09 23:13:00

+0

哇。刚刚在1.3.1上测试过,并在那里工作。 – 2012-04-09 23:17:09