在Django的urlpatterns中使用变量

0 投票
3 回答
2134 浏览
提问于 2025-04-16 00:48

我正在做的Django应用程序的URL组件非常“可插拔”,不同的组合在各种URL模式中使用,所以我们的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.

这样看起来可以保持代码的整洁。然而,我发现每当我尝试反向查找任何由这些URL模式指向的视图时,总是会出现NoReverseMatch错误。经过一番折腾,我发现如果在模式中使用完整的原始字符串,而不是拼接子字符串,就解决了这个问题。

那么,在URL模式中真的有必要只使用原始字符串吗?我找不到相关的文档。是个bug还是特性?如果要复制粘贴那些重复使用的正则表达式模式,感觉就违反了DRY原则(不要重复自己)。

3 个回答

0

你可以用一个名字来标识你的网址模式,像这样:

urlpatterns = patterns('',
     url(repo_type_param + r'view-source' + opt_rev_param + path_param, view_source, name='myurlname'),
)

注意网址和名字,然后可以像这样进行反向匹配:

reverse('myurlname', kwargs={'groupname': 'value'})

希望这对你有帮助

1

我发现这个方法可以用来处理重定向,可能对你的情况也有帮助(除非我理解错了你的问题)。我无法在同一个元组里反转一个模式,但如果我定义一个新的元组,然后把这个新元组和原来的元组连接起来,Django 就能正常反映出来。

例子:
  urlpatterns = patterns('',
         ('^foo/$','foo.views.foo')
  )
  urlpatterns+= patterns('',('^$','django.views.generic.simple.redirect_to',{'url':reverse('foo.views.foo')}))
1

我不太确定什么是连接字符串,但我知道你可以格式化原始字符串,并把它们用在网址模式中。你可以看看这个链接,里面有个例子:BlogView.urlpatterns

撰写回答