【问题标题】:Using variables in Django urlpatterns在 Django urlpatterns 中使用变量
【发布时间】:2011-03-11 14:11:35
【问题描述】:

我正在开发的 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。

【问题讨论】:

  • python 喜欢遵循的一件事是显式优于隐式 - 这可能是不允许连接的可能原因。虽然如果没有办法做你所追求的,我会感到非常惊讶。 :-)

标签: python django


【解决方案1】:

我不确定串联,但我知道您可以格式化原始字符串并在 urlpatterns 中使用它们。示例见BlogView.urlpatterns

【讨论】:

    【解决方案2】:

    我发现此模式适用于重定向,并且可能对您的情况有所帮助(除非我对您的问题的解释不正确)。我无法在同一个元组中反转模式,但如果我定义了一个新元组,然后将一个新元组连接到原始 Djanogo 将毫无问题地反映。 例如:

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

    【讨论】:

      【解决方案3】:

      您可以使用名称来识别您的 url 模式,如下所示:

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

      记下网址和名称,然后像这样反向匹配:

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2014-07-19
        • 1970-01-01
        • 2021-07-27
        • 1970-01-01
        • 2012-04-13
        • 2016-07-17
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        相关资源
        最近更新 更多