我正在用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'),
]
现在我这里有三个参数,name
,add_url
和admin_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')