根据Django中捕获的URL参数过滤QuerySet?

时间:2012-04-09 22:35:07

标签: python django django-urls

我正在创建一个通用模板,该模板将显示查询集中的对象列表:

{% 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参数传递给视图函数来动态过滤或命令显示查询集?

2 个答案:

答案 0 :(得分: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

虽然说实话,我不确定这是否是一种很好的做事方式......

答案 1 :(得分:0)

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

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