【问题标题】:Default parameters to actions with DjangoDjango 动作的默认参数
【发布时间】:2010-09-19 01:55:52
【问题描述】:

在正则表达式不匹配任何使用 django 的情况下,有没有办法将默认参数传递给操作?


urlpatterns = patterns('',(r'^test/(?P<name>.*)?$','myview.displayName'))

#myview.py
def displayName(request,name):
      # write name to response or something

我尝试将 urlpatterns 中的第三个参数设置为包含 ' 的字典,并为方法的 name 参数提供默认值,但均无效。 name 参数似乎总是无。如果我可以设置默认值,我真的不想为 None 编写检查代码。

澄清:这是我将其更改为的示例。


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

urlpatterns = patterns('',
      (r'^test/(?P<name>.*)?$',
        'myview.displayName',
        dict(name='Test')
      )
)

当我将浏览器指向视图时,它会显示文本 '无'

有什么想法吗?

【问题讨论】:

  • 一个完整的,最后的'?'是不必要的,因为 '*' 将匹配零个或多个字符,因此,'^test/.*$' 匹配 'test/' 和 'test/name' 就好了。

标签: python django django-urls


【解决方案1】:

问题是当模式与'test/'匹配时,正则表达式捕获的groupdict包含映射'name' => None:

>>> url.match("test/").groupdict()
{'name': None}

这意味着当视图被调用时,使用我期望的类似于下面的东西:

view(request, *groups, **groupdict)

相当于:

view(request, name = None)

对于'test/',意味着该名称被分配为None而不是未分配。

这让您有两个选择。你可以:

  1. 在视图代码中显式检查 None,这有点骇人听闻。
  2. 重写 url 调度规则,使名称捕获成为非可选的,并在未提供名称时引入第二条规则进行捕获。

例如:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)$','myview.displayName'), # note the '+' instead of the '*'
    (r'^test/$','myview.displayName'),
)

当采用第二种方法时,您可以简单地调用不带捕获模式的方法,让 python 处理默认参数,或者您可以调用不同的委托视图。

【讨论】:

    【解决方案2】:

    认为你可以def displayName(request, name=defaultObj);这就是我过去所做的,至少。您将默认值设置为什么?

    【讨论】:

    • 您是否在 Django 视图操作中执行此操作,其中该 URL 的模式包含该参数的可选命名捕获?因为那对我不起作用。谢谢
    • 我在一个带有参数的模式中完成了它(不是一个命名的)。
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多