Django Python urlencode 具有多个值的相同键

问题描述 投票:0回答:2

正如标题所示,我正在尝试使用 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 中使用的东西

python python-3.x django django-views django-urls
2个回答
3
投票

urllib.parse.urlencode

当双元素元组序列用作查询参数时,每个元组的第一个元素是键,第二个元素是值。 value 元素本身可以是一个序列,在这种情况下,如果可选参数

doseq
的计算结果为 True,则为键的值序列的每个元素生成由 '&' 分隔的单独的 key=value 对。编码字符串中参数的顺序将与序列中参数元组的顺序匹配。

这是一个简单的例子:

from urllib import parse

print(parse.urlencode({"a": [1, 2], "b": 1}, doseq=True))
# "a=1&a=2&b=1"

0
投票

只需使用 urlencodedoseq=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}"
© www.soinside.com 2019 - 2024. All rights reserved.