我正在处理的Django应用程序的URL的组件非常“可插拔”,并且它们的不同组合在各种urlpatterns中使用,因此我们的urls.py看起来像:
rev = r'(/R\.(?P<rev>\d+))?'
repo_type= r'^(?P<repo_type>svn|hg)/'
path = r'/dir/(?P<path>.*)$'
# etc.
urlpatterns = patterns('',
(repo_type_param + r'view-source' + opt_rev_param + path_param, view_source),
(repo_type_param + r'history' + path_param, history),
(repo_type_param + r'revision' + opt_rev_param + r'/$', revision),
) #etc.
这似乎是一种保持清洁的好方法。但是,当我试图反转urlpatterns指向的任何视图时,我发现我一直收到NoReverseMatch错误。经过大量的修补,我发现在模式中使用完整的原始字符串,而不是连接子字符串,修复了问题。
那么,是否真的有必要在urlpatterns中只使用原始字符串?我无法在任何地方找到这个记录。错误或功能?必须复制和粘贴重复使用的正则表达式模式似乎违反了DRY。
答案 0 :(得分:1)
我发现此模式适用于重定向,可能对您的情况有所帮助(除非我错误地解释您的问题)。我无法在同一元组中反转模式,但如果我定义了一个新元组然后连接到原始Djanogo的新元组将反映没有问题。 例如:
urlpatterns = patterns('',
('^foo/$','foo.views.foo')
)
urlpatterns+= patterns('',('^$','django.views.generic.simple.redirect_to',{'url':reverse('foo.views.foo')}))
答案 1 :(得分:1)
我不确定连接,但我知道你可以格式化原始字符串并在urlpatterns中使用它们。有关示例,请参阅BlogView.urlpatterns
。
答案 2 :(得分:0)
您可以使用名称来识别您的网址格式:
urlpatterns = patterns('',
url(repo_type_param + r'view-source' + opt_rev_param + path_param, view_source, name='myurlname'),
)
注意网址和名称,然后像这样反向匹配:
reverse('myurlname', kwargs={'groupname': 'value'})
希望有所帮助