Django视图忽略了第二个参数

时间:2014-03-21 13:44:35

标签: django django-views django-urls

我在Django中有一个菜单内容系统,其中的菜单项通过ID访问,其内容通过ID访问。我的URL映射是:

url(r'^menu/(?P<item_key>[a-z/\-]*[a-z])/', views.menu, name='menu'),
url(r'^menu/(?P<item_key>[a-z/\-]*[a-z])/(?P<content_id>\d+)/', views.menu,\
                                               name='menu_showById'),

第一个是基本视图,用户在通过导航栏单击项目后将着陆。第二个用于查看菜单项中的特定内容。 views.menu有一个名为content_id的可选参数,默认为None(在这种情况下,它会查看最新内容)。

导航栏链接正常,指向菜单项http://localhost:8000/menu/some-item/sub-item。在使用{% url 'data:menu' node.key %} [1]在模板中生成的此URL中,/menu/是视图,some-item/sub-item是item_key(示例匹配实际用例; 几乎所有项目键。)

通过基本视图,我点击了使用{% url 'data:menu_showById' menuItem.key cItem.id %}作为http://localhost:8000/menu/some-item/sub-item/2/生成的链接,以查看ID为2的内容。生成的网址没有任何问题,它们看起来没问题正如我想要的那样,URL映射正则表达式正确匹配它们。

问题是,虽然menu_showById正确地将item_key参数设为some-item/sub-item,但永远不会捕获第二个参数content_id

...为什么?

^ [1]:node是用于保存菜单项的django-mptt树结构中的一个节点。

2 个答案:

答案 0 :(得分:2)

第一个正则表达式始终匹配,因此从不拾取content_id。尝试在urls.py中切换顺序。

答案 1 :(得分:1)

获得的经验:尽可能严格保持您的URL正则表达式。 scoopseven的答案是最明显的解决方案,也是定义URL的一个重要规则,但用它来修复这样的东西对我来说就像是一个黑客攻击,更重要的是把我的URL的顺序变成一个我没有做到的喜欢。所以我从

更改了基本网址

url(r'^menu/(?P<item_key>[a-z/\-]*[a-z])/', views.menu, name='menu')

url(r'^menu/(?P<item_key>[a-z/\-]*[a-z])/$', views.menu, name='menu')

现在它就像一个魅力。