1

我的应用程序中有以下用于 url 路由的内容:

网址.py

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

视图.py

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

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

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

flavors_detail函数接受 5 个参数,但在 url 中它们是无序的。

4

1 回答 1

2

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

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

 ?P<content_type>

将产生kwarg content_type. 查看repython ( docs ) 中的模块。

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

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

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

但是,Python 也将接受您之前的定义(我的评论为时过早),只要您小心保留参数顺序!这里有更多关于这是如何发生的信息- 引用

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

于 2013-03-19T18:38:07.007 回答