2013-03-19 54 views
1

我在我的应用程序的URL路由如下:蟒蛇Django的名为VS的位置参数的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中,它们是乱序的。

回答

2

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

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

?P<content_type> 

会产生kwargcontent_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也会接受你以前的定义(我的评论为时尚早),只要你小心保存参数顺序!有关于如何happend here更多信息 - 引用

如果关键字参数都存在,它们首先被转换为因此,基于我称之为我的函数的变量将映射位置参数

+0

到那和顺序无关紧要? – 2013-03-19 18:45:42

+0

是的,所以'content_type'将永远是你的url中'detail'后面发生的事情,因为它是'kwarg','flavors_detail'中的顺序并不重要(但你仍然需要'def flavors_detail(request,slug = slug,asset_id = asset_id,content_type = content_type,format =“html”):' – danodonovan 2013-03-19 19:57:32

+0

我没有slug = slug,asset_id = asset_id,它仍然有效。这怎么可能?我上面的内容正是它的定义。 – 2013-03-19 20:13:14