QueryDict 是一个类字典对象,新增的属性与方法都需要了解。
通过这篇文章,你能了解到:
- QueryDict是什么?
- QueryDict的属性与方法
源码
源码中 QueryDict 定义如下:
| 1 | class QueryDict(MultiValueDict): | 
属性
| 属性名 | 解释 | 
|---|---|
| _mutable | 在实例化的时候,mutable=False,默认为False,不能对键对应值进行修改,修改 _mutable为True后就可以修改了。 | 
| _encoding | 在实例化的时候,encoding=None,默认使用settings.DEFAULT_CHARSET进行编码 | 
方法
| 方法名 | 解释 | 
|---|---|
| setlist(self, key, list_) | |
| setlistdefault(self, key, default_list=None) | |
| appendlist(self, key, value) | |
| pop(self, key, *args) | |
| popitem(self) | |
| clear(self) | |
| setdefault(self, key, default=None) | |
| copy(self) | 深拷贝 + 可修改 | 
| urlencode(self, safe=None) | 将所有的参数(query string)编码后拼接在一起。这样不会被request因为&而进行切分。 | 
例子(编辑之后重定向)
背景:当我们完成编辑时,希望返回的是进入编辑前的页面,而不是其它页面,所以我们需要对展示页面中a标签的链接进行一个修改,从而完成编辑后能返回这个展示页面,目标结果如下:
| 1 | /crm/customer_edit/22?next=/crm/customer_search/?page=2&search=1 | 
- /crm/customer_edit/22是将要打开的编辑页面
- ?next=/crm/customer_search/?page=2&search=1next后面记录了我们当前展示页面的url,这样在完成编辑后,就可以通过这个next,回到展示页面。
但在实际中,新的request请求会按照&进行切分,next对应的值就不完整了,所以实际中需要进行编码,效果如下
| 1 | /crm/customer_edit/22?next=/crm/customer_search/%3Fpage%3D2%26search%3D1 | 
方式:使用simple_tag,来生成可返回的url地址。
关键在于:url上面携带着成功后要跳转的地址
定义:
- 将待前往编辑的url,通过reverse反向解析生成
- 创建可变的QueryDict,并把当前完整的url 放在这个QueryDict中。
- 使用 urlencode进行编码得到 历史url,参数safe会在url前面加一个/这样保证是从/开始
- 将这两个url进行拼接,中间用 ?连接。
| 1 | # my_tags.py | 
使用:
html中使用 simple_tag
| 1 | <td><a href="{% url_tag request "crm:customer_edit" q.pk %}" class="btn btn-danger btn-sm">编辑</a></td> | 
视图中只需要从request中拿到这个next参数就可以
| 1 | # views.py | 
效果如下:
| 1 | /crm/customer_edit/38?next=/crm/customer_search/%3Fpage%3D2%26search%3D1 | 

