正如标题所示,我正在尝试使用 python 中的 Ordered Dict 进行 urlencode
def url_replace(request, field, value, direction=""):
dict_ = request.GET.copy()
if field == "order_by" and field in dict_.keys():
if dict_[field].startswith("-") and dict_[field].lstrip("-") == value:
dict_[field] = value
elif dict_[field].lstrip("-") == value:
dict_[field] = "-" + value
else:
dict_[field] = direction + value
else:
dict_[field] = direction + str(value)
print("UNORDERED___________________")
print(dict_)
print(super(MultiValueDict, dict_).items())
print("ORDERED_____________")
print(OrderedDict(super(MultiValueDict, dict_).items()))
print(OrderedDict(dict_.items()))
return urlencode(OrderedDict(dict_.items()))
上述代码的输出
UNORDERED___________________
<QueryDict: {'assigned_to_id': ['1', '2'], 'client_id': ['2', '1'], 'page': ['2']}>
dict_items([('assigned_to_id', ['1', '2']), ('client_id', ['2', '1']), ('page', ['2'])])
OrderedDict([('assigned_to_id', '2'), ('client_id', '1'), ('page', '2')])
ORDERED_____________
OrderedDict([('assigned_to_id', ['1', '2']), ('client_id', ['2', '1']), ('page', ['2'])])
OrderedDict([('assigned_to_id', '2'), ('client_id', '1'), ('page', '2')])
如您所见,分配的_to_id 最后只有
2
。
我期待的是一个有序的字典
OrderedDict([('assigned_to_id', '2'),('assigned_to_id', '1'), ('client_id', '1'), ('client_id', '2'),('page', '2')])
也许有更好的方法,我对 python 有点陌生
我的最终目标是返回一个具有多个键的字典或任何可以在 urlencode 中使用的东西
urllib.parse.urlencode
当双元素元组序列用作查询参数时,每个元组的第一个元素是键,第二个元素是值。 value 元素本身可以是一个序列,在这种情况下,如果可选参数
的计算结果为 True,则为键的值序列的每个元素生成由 '&' 分隔的单独的 key=value 对。编码字符串中参数的顺序将与序列中参数元组的顺序匹配。doseq
这是一个简单的例子:
from urllib import parse
print(parse.urlencode({"a": [1, 2], "b": 1}, doseq=True))
# "a=1&a=2&b=1"
只需使用 urlencode 和 doseq=True
注意:先转换为dict,否则不起作用
示例:
from urllib.parse import urlencode
@register.filter
def get_query_url(req_get, page_num=None):
copy = dict(req_get.lists())
if page_num is not None:
copy["page"] = page_num
result = urlencode(copy, doseq=True)
return f"?{result}"