Python中Django的url反查函数reverse如何指定查询参数(?号参数)?只能自己手动拼接吗?

null
Python中Django的url反查函数reverse如何指定查询参数(?号参数)?只能自己手动拼接吗?

2 回复

在Django里用reverse搞不定查询参数(就是?后面的东西),这函数只管路径部分。你得自己手动拼。

比如你要生成 /articles/?category=python&page=2 这个URL:

from django.urls import reverse
from urllib.parse import urlencode

# 1. 先用reverse拿到基础路径
base_url = reverse('article_list')  # 假设这个name对应 '/articles/'

# 2. 准备查询参数
query_params = {'category': 'python', 'page': 2}

# 3. 拼接完整URL
full_url = f"{base_url}?{urlencode(query_params)}"

如果你在模板里用,Django的 {% url %} 标签也一样处理不了查询参数,也得拼:

{% with "category=python&page=2" as query_string %}
<a href="{% url 'article_list' %}?{{ query_string }}">链接</a>
{% endwith %}

有些哥们儿会自己写个工具函数省事儿:

from django.urls import reverse
from urllib.parse import urlencode

def reverse_with_params(viewname, args=None, kwargs=None, query_params=None):
    url = reverse(viewname, args=args, kwargs=kwargs)
    if query_params:
        url = f"{url}?{urlencode(query_params)}"
    return url

# 用起来这样
url = reverse_with_params('article_list', query_params={'category': 'python'})

总结:查参数都得自己手动拼到reverse出来的路径后面。


如果大量用到了 django 的模板,那么 reverse 可以省好多代码,可以考虑放弃 querystring 的方式传参,使用 django 自带的
https://docs.djangoproject.com/en/2.0/topics/http/urls/#examples
方式传参

回到顶部