Django使用request.GET
或request.POST
来获取参数,而这两个属性都是不可变的django.http.QueryDict
对象,默认是不支持修改的。而我们有时候需要修改请求参数,怎么做呢?
方法1:拷贝副本-> 修改 -> 赋值回去
可以利用QueryDict
的copy()
方法,得到一个可变的QueryDict
副本,在副本上修改参数值后,再赋值给request.GET
对象。 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def local_product_list(request): """ 获取本地产品列表 """ params = request.GET.copy() params['local'] = True request.GET = params return product_list(request)
def product_list(request): """ 获取产品列表 """ ...
|
方法2:修改不可变属性
直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| def local_product_list(request): """ 获取本地产品列表 """ mutable_value = request.GET._mutable if not mutable_value: request.GET._mutable = True request.GET['local'] = True if not mutable_value: request.GET._mutable = False return product_list(request)
def product_list(request): """ 获取产品列表 """ ...
|
注意:QueryDict
的update()
方法跟我们常用的dict.update()
有所不同。
以下两段代码的效果是不一样的:
1 2 3 4 5 6
| >>> q2 = QueryDict('local=False', mutable=True) >>> q2 <QueryDict: {'local': ['False']}> >>> q2['local'] = True >>> q2 <QueryDict: {'local': [True]}>
|
1 2 3 4 5 6
| >>> q3 = QueryDict('local=False', mutable=True) >>> q3 <QueryDict: {'local': ['False']}> >>> q3.update({'local': True}) >>> q3 <QueryDict: {'local': ['False', True]}>
|
这是因为, request.GET['local'] = True
是直接修改原local
参数的值,而request.GET.update({'local': True})
是追加新的值到local
参数值的数组中。请务必小心!