You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板使用url标签编码URL参数以避免NoReverseMatch错误

解决Django路由含斜杠参数的NoReverseMatch错误

问题场景

使用Python 3.10 + Django 4.1开发项目,定义路由如下:

app_name = 'admin_extend'

urlpatterns = [
    path('add_fav/<str:name>/<str:add_url>/<str:admin_url>/', views.add_fav, name='add_fav'),
]

模板中通过{% url %}标签生成URL:

<a href="{% url 'admin_extend:add_fav' name=model.name add_url=model.add_url admin_url=model.admin_url %}" class="changelink">{% translate 'Fav' %}</a>

当add_url、admin_url参数包含斜杠(如add_url='/a/b/c/')时,触发NoReverseMatch错误:

Reverse for 'add_fav' with keyword arguments '{'name': 'foo', 'add_url': '/a/b/c/', 'admin_url': '/c/d/e/'}' not found. 1 pattern(s) tried: ['admin_extend/add_fav/(?P<name>[^/]+)/(?P<add_url>[^/]+)/(?P<admin_url>[^/]+)/\\Z']

原因分析

Django的path路由中,<str:>转换器的默认匹配规则是[^/]+,即不允许包含斜杠。当参数里带有/时,反向解析生成的URL会被斜杠分割成多个片段,无法匹配原路由的三个参数结构,因此报错。

解决方案

方案1:用re_path(正则路由)替换path

将原path改为re_path,通过正则表达式定义允许包含斜杠的参数匹配规则:

from django.urls import re_path

app_name = 'admin_extend'

urlpatterns = [
    re_path(r'add_fav/(?P<name>[^/]+)/(?P<add_url>.*)/(?P<admin_url>.*)/$', views.add_fav, name='add_fav'),
]
  • [^/]+:匹配name参数,确保它不含斜杠,避免和后续参数混淆
  • .*:匹配add_url和admin_url,允许包含任意字符(包括斜杠)

方案2:将参数改为查询字符串(GET参数)

不在路由路径中传递add_url和admin_url,改为通过查询参数传递,彻底规避路径斜杠冲突:

  1. 修改路由,仅保留name参数:
app_name = 'admin_extend'

urlpatterns = [
    path('add_fav/<str:name>/', views.add_fav, name='add_fav'),
]
  1. 模板中拼接基础URL与查询参数:
{% url 'admin_extend:add_fav' name=model.name as base_url %}
<a href="{{ base_url }}?add_url={{ model.add_url|urlencode }}&admin_url={{ model.admin_url|urlencode }}" class="changelink">{% translate 'Fav' %}</a>
  1. 视图中获取查询参数:
def add_fav(request, name):
    add_url = request.GET.get('add_url')
    admin_url = request.GET.get('admin_url')
    # 后续业务逻辑

方案3:自定义路径转换器

自定义一个允许包含斜杠的路由转换器,替代默认的<str:>:

  1. 在app目录下创建converters.py:
class SlashConverter:
    regex = '.*'

    def to_python(self, value):
        return value

    def to_url(self, value):
        return value
  1. 在项目根urls.py中注册转换器:
from django.urls import register_converter
from your_app.converters import SlashConverter

register_converter(SlashConverter, 'slash_str')
  1. 修改路由使用自定义转换器:
app_name = 'admin_extend'

urlpatterns = [
    path('add_fav/<str:name>/<slash_str:add_url>/<slash_str:admin_url>/', views.add_fav, name='add_fav'),
]

内容的提问来源于stack exchange,提问作者ufk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:39:51