我的应用中有以下网址:
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中它们不正常。
答案 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 - 引用
如果存在关键字参数,则首先将它们转换为位置参数