我需要调用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的视图函数的参数,而177013
和1337
是最终被替换的占位符。但是,这种方法是一种拙劣的方法,以后将很难维护。为此,我想用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_type
和jewelry_style_user
是jewelry_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
或必须对其进行硬编码?
答案 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();
}
模式不匹配。