gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:00 24 4
gpt4 key购买 nike

我正在制作一个通用模板,它将显示查询集中的对象列表:

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

我希望能够在多种需要执行不同类型的过滤和排序的情况下使用该模板。我为此创建了一个 View 函数:

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'))

显然,在解析 URL 并将其分派(dispatch)给 display_objects 函数之前,account_username 并不是一个已定义的字段。制作一个采用 account_username 参数的 View 函数很容易,但我希望能够使用该函数来显示其他对象查询集,这些对象查询集将使用不同的捕获参数进行过滤。

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

最佳答案

这是您可以执行此操作的一种方法:

在 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

虽然老实说我不确定这是否是一个好的做事方式......

关于python - 根据 Django 中捕获的 URL 参数过滤 QuerySet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10080737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com