python Django命名为url路由的位置参数

时间:2013-03-19 18:33:07

标签: python django url

我的应用中有以下网址:

urls.py

urlpatterns = patterns('rocflavors.views',
   url('^detail/(?P<content_type>[^/]+)/(?P<slug>[^/]+)/(?P<asset_id>\d{1,32})$', 'flavors_detail', name='flavors_detail'),
)

views.py

def flavors_detail(request, slug, asset_id, content_type, format="html"):

似乎我使用的参数是命名参数。 (content_type,slug,asset_id)。

Django / python如何知道何时传递位置参数与关键字参数?

flavors_detail函数接受5个参数,但在url中它们不正常。

1 个答案:

答案 0 :(得分:2)

要回答您的问题,flavor_detail将接受四个参数(按顺序)和一个关键字参数。 url中的正则表达式将按顺序传递它找到的匹配项,但由于您还为每个arg定义了一个关键字,它将传递一个kwarg字典。由于您保持变量名称一致,因此dict将在正确的位置传递正确的args(如果您使用了不同的变量名称,那么这将不起作用)。您可以通过简单地为flavors_detail指定关键字参数来避免这种“魔力”,如下所述。

您的url是一个定义它们的正则表达式:

 ?P<content_type>

将生成kwarg content_type。查看python中的re模块(docs)。

  

(?P<name>...)   与常规括号类似,但是通过符号组名称名称可以在正则表达式的其余部分中访问由组匹配的子字符串。组名必须是有效的Python标识符,并且每个组名只能在正则表达式中定义一次。符号组也是编号组,就像组未命名一样。因此,下面示例中名为id的组也可以作为编号组1引用。

当您将变量定义为关键字args kwargs时,您可以更改视图声明以接受kwargs:

def flavors_detail(request, slug=slug, asset_id=asset_id, content_type=content_type, format="html"):

然而,Python也会接受你之前的定义(我的评论为时过早),只要你小心保留参数顺序!有关如何发生这种情况的更多信息here - 引用

  

如果存在关键字参数,则首先将它们转换为位置参数