Django的reverse()函数是否将列表作为参数?

时间:2018-08-14 18:54:10

标签: python django django-views django-urls django-1.11

我需要调用Django的reverse()方法来为某个视图函数style_specific构造一个URL。在urls.py中的条目如下:

图1

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(搜索引擎),它将自己的参数插入到构造的URL中,因此我需要使用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硬编码列表中。 (或者至少是语法的样子。)我试图克服这一障碍的解决方案是将replace_parameters的键称为list,即{ {1}}同this SO answer。 (请参见下文)

图4

list(replace_parameters.keys())

此方法具体产生了specific_url = reverse('jewelry:specific_method',args=list(replace_parameters.keys()))

图5

NoReverseMatch

其中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中的键。

作为调试的一部分,我仔细检查了图1的正则表达式,并使用其他视图函数验证了它的传递。我还通过测试replace_parameters验证了list(replace-parameters.keys())。我还尝试将括号放在isinstance(list(replace_parameters.keys()),list)周围,但这也没有执行任何操作。 Django's documentation on reverse()暗示list(replace_parameters.keys())应该有一个args传递进去,但这并不清楚。因此,我的问题是: list是否允许将reverse()对象传递到list或必须对其进行硬编码?

1 个答案:

答案 0 :(得分:0)

replace_parameters.keys()的意思是keys,而不是值。

您为什么不使用kwargs呢?dict更适合于命名占位符匹配?尤其是当replace_parameters已经是specific_url = reverse('jewelry:specific_method', kwargs=replace_parameters) 时。

'jewelry_style_user': '{{ jewelry_style }}', 'jewelry_id': '{{objectID}}'

某人必须评估{{}}中的Reverse个占位符。 {{ jewelry_style }}函数只能按原样看到[A-Za-z0-9_-]+作为字符串,这确实与 public virtual void Open() { CheckConnection(); Connection.Close(); Connection.ConnectionString = ConnectionString; Connection.Open(); } 模式不匹配。