【问题标题】:Does Django's reverse() function take in a list as a parameter?Django 的 reverse() 函数是否将列表作为参数?
【发布时间】: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 的视图函数的参数,1770131337 是最终被替换的占位符。然而,这种方法是一种老套的方法,以后很难维护。为此,我想用更灵活的方法替换这个解决方案,就像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_typejewelry_style_userjewelry_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&lt;jewelry_type&gt;[A-Za-z0-9_-]+)/(?P&lt;jewelry_style_user&gt;[A-Za-z0-9_-]+)/(?P&lt;jewelry_id&gt;[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


【解决方案1】:

replace_parameters.keys() 表示 keys,而不是值。

为什么不使用更具体的命名占位符匹配的kwargs?尤其是当 replace_parameters 已经是 dict

specific_url = reverse('jewelry:specific_method', kwargs=replace_parameters)

并且必须有人评估 {{}} 中的 'jewelry_style_user': '{{ jewelry_style }}', 'jewelry_id': '{{objectID}}' 占位符。 Reverse 函数只能将 {{ jewelry_style }} 视为字符串,因为它确实与 [A-Za-z0-9_-]+ 模式不匹配。

【讨论】:

  • 我尝试将我的正则表达式修改为可能有效的内容(例如(?P&lt;jewelry_style_user&gt;[A-Za-z0-9_{}]+)),但没有任何结果。
  • 这不是正则表达式问题。正则表达式很好。修复你的字典中的值。将'{{ jewelry_style }}' 替换为实际值。
  • 问题是 Algolia 检查{{ jewelry_style }} 以输入实际值——即reverse() 不直接插入实际值。我正在考虑的一种解决方法是简单地对 url 进行硬编码,但 reverse() 的存在是有原因的。
  • 正如您在原始问题中所述:does reverse support list/dict arguments - 是的。将您的 replace_parameters 传递为 kwargs 就可以了。 Reverse 确实支持这个参数并且知道该怎么做。问题在于replace_parameters - 它包含占位符而不是值。哪个与您的正则表达式不匹配。就是这样。
猜你喜欢
  • 2020-10-06
  • 2012-08-15
  • 2010-11-28
  • 2016-01-08
  • 1970-01-01
  • 2023-01-22
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多