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=1
next后面记录了我们当前展示页面的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 |