Django修改request对象的两种方法

Django使用request.GETrequest.POST来获取参数,而这两个属性都是不可变的django.http.QueryDict对象,默认是不支持修改的。而我们有时候需要修改请求参数,怎么做呢?

方法1:拷贝副本-> 修改 -> 赋值回去

可以利用QueryDictcopy()方法,得到一个可变的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):
"""
获取产品列表
"""
...

注意:QueryDictupdate()方法跟我们常用的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参数值的数组中。请务必小心!