我想做一些排序,我想要的是用一个名为ordered的参数做一个GET请求,这个值将是我将用来排序的模型atttribute:
?order=['-age', 'height']
问题是当我尝试接收订单参数时..值是一个列表。
我尝试使用这样的ast:
if 'order' in request.GET:
import ast
order = ast.literal_eval(request.GET.get('order'))
queryset = queryset.order_by(*order)
有效。但是,我想避免使用ast库,还有其他方法吗?
更新
我做了这样的参数:
?顺序= -age,高度
就像在python中使用split一样:
if 'order' in request.GET:
order = request.GET.get('order').split(',')
queryset = queryset.order_by(*order)
答案 0 :(得分:1)
Django允许在请求中发送多个GET参数,但是你发送它们的方式是错误的(不仅仅是Django)
您的请求应采用?order=-age&order=height
形式
然后在视图中,您可以执行order_list = request.GET.getlist('order')
您无需检查密钥'order'是否在GET参数中,因为如果找不到密钥,.getlist()
会返回一个空列表...
如果您只想要列表中的第一项,则可以使用request.GET.get('order')
,如果该密钥不存在,则返回None。
最终代码:
order_list = request.GET.getlist('order')
queryset = queryset.order_by(*order_list)
PS 虽然django允许将GET参数命名为任何东西,但PHP(我认为其他Web语言)需要将GET列表参数命名为param [](示例order []),因此库像JQuery一样命名你的AJAX请求params。
在这种情况下,您必须在视图中使用正确的名称,即request.GET.getlist('order[]')