在Django urlpatterns中使用变量

时间:2010-07-04 08:33:45

标签: python django

我正在处理的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。

3 个答案:

答案 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'})

希望有所帮助