能够在django模板中对url参数中的斜杠进行编码,同时使用url标记来防止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'),
]

现在我这里有三个参数,nameadd_urladmin_url

addurl和adminurl都包含"/",所以我需要能够在django模板中转义它们。

这是我在模板中的代码:

<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>

假设参数值为name='foo',add_url='/a/b/c/',admin_url='/c/d/e/',路由以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']

我测试了它,如果我提供的参数没有/字符,那么我不会出错。

我的问题是,我真的找不到任何地方可以逃避这些参数,我在谷歌上搜索并检查了很多

例如,我不能在之前和之后使用{% filter urlencode %},因为url需要首先验证,然后它将通过urlencode,

我了解到我不能在这些模板中运行python代码,所以我不能使用django.utils.http中的urlqoute

并且以这种方式使用urlencode过滤器不是正确的语法:

{% url 'admin_extend:add_fav' name=(model.name|urlencode) add_url=(model.add_url|urlencode) admin_url=(model.admin_url|urlencode) %}

我该如何解决此问题?

感谢

多亏了@Amrez,解决方案比预期的更简单,解决方案是在Djang2urls中如何用斜杠传递参数

我将url参数类型定义为str,我不知道在这种情况下有一个名为path的类型,所以只需更改url模式,问题就解决了,我不需要转义任何内容,但请注意,最初我添加了<path:add_url>/<path:admin_url>,因为path中包含/,这混淆了url解析器和输入add_url变量的两个参数。我需要将其更改为#而不是/,并且它工作正常:

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

最新更新