我在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树结构中的一个节点。
答案 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')
现在它就像一个魅力。