【发布时间】:2018-08-14 18:54:09
【问题描述】:
我需要调用 Django 的reverse() 方法来为某个视图函数style_specific 构造一个URL。它在urls.py 中的条目如下:
图一
url(r'^(?P<jewelry_type>[A-Za-z0-9]+)/(?P<jewelry_style_user>[A-Za-z0-9]+)/(?P<jewelry_id>[0-9]+)/$',views.style_specific,name="style_specific"),
我也在使用 Algolia(一个搜索引擎),它将自己的参数插入到构建的 URLS 中,所以我需要使用 reverse() 来插入可以由 Algolia 操作的占位符。这以前在我两次调用reverse 时有效--
图2
specific_url = (reverse('jewelry:specific_method',args=[model_name,177013,1337]).replace('1337','{{objectID}}')).replace('177013','{{jewelry_style}}')
其中model_name 是传递给构造style_specific 的URL 的视图函数的参数,177013 和1337 是最终被替换的占位符。然而,这种方法是一种老套的方法,以后很难维护。为此,我想用更灵活的方法替换这个解决方案,就像this SO answer 一样。理想情况下,占位符/替换将由字典 replace_parameters 定义,如
图 3
replace_parameters={'placeholder_1':'replacement_1','placeholder_2':replcement_2} #and so on
不幸的是,这就是我的问题所在。在图 2 中,参数被传递到 args 一个硬编码列表中。 (或者至少 syntax 是这样的)我试图克服这个障碍的解决方案是将replace_parameters 的键称为list——即list(replace_parameters.keys()) par @ 987654322@。 (见下文)
图 4
specific_url = reverse('jewelry:specific_method',args=list(replace_parameters.keys()))
这种方法产生了这个NoReverseMatch具体:
图 5
Reverse for 'style_specific' with arguments '('jewelry_type', 'jewelry_style_user', 'jewelry_id')' not found. 1 pattern(s) tried: ['jewelry/(?P<jewelry_type>[A-Za-z0-9]+)/(?P<jewelry_style_user>[A-Za-z0-9]+)/(?P<jewelry_id>[0-9]+)/$']
其中jewelry_type、jewelry_style_user 和jewelry_id 是来自replace_parameters 的键。
作为调试的一部分,我仔细检查了图 1 的正则表达式,并使用不同的视图函数验证它通过了。我还通过测试isinstance(list(replace_parameters.keys()),list) 验证了list(replace-parameters.keys())。我还尝试在list(replace_parameters.keys()) 周围放置括号,但这也无济于事。 Django's documentation on reverse() 暗示 args 应该有一个 list 传递给它,但这并不清楚。因此我的问题是:reverse() 是否允许将 list 对象传递到 args 中,还是必须对其进行硬编码?
【问题讨论】:
-
请添加
replace_parameters包含的真实内容(不是“占位符”)。和完整的错误信息。如果可以,请缩短您的问题。 -
replace_parameters特别是{'jewelry_type':obj.__name__,'jewelry_style_user':'{{ jewelry_style}}','jewelry_id':'{{objectID}}'})其中obj是 Django 模型类。{{objectID}}和{{jewelry_style}}最终被 Algolia 覆盖。 -
与
kwargs尝试错误消息应该不同。这是什么? -
Reverse for 'style_specific' with keyword arguments '{'jewelry_type': 'Metal', 'jewelry_style_user': '{{ jewelry_style }}', 'jewelry_id': '{{objectID}}'}' not found. 1 pattern(s) tried: ['jewelry/(?P<jewelry_type>[A-Za-z0-9_-]+)/(?P<jewelry_style_user>[A-Za-z0-9_-]+)/(?P<jewelry_id>[0-9_-]+)/$'] -
有人必须评估 {{}} 中的
'jewelry_style_user': '{{ jewelry_style }}', 'jewelry_id': '{{objectID}}'占位符。Reverse函数只能将{{ jewelry_style }}视为字符串,因为它确实与[A-Za-z0-9_-]+模式不匹配。kwargs是正确的方法。
标签: python django django-views django-urls django-1.11