【问题标题】:Django view ignoring second argumentDjango视图忽略第二个参数
【发布时间】:2014-03-21 13:44:34
【问题描述】:

我在 Django 中有一个菜单内容系统,其中菜单项通过其键访问,其内容通过 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 没有任何问题,它们看起来完全符合我的要求,并且URL 映射正则表达式正确匹配它们。

问题是,虽然menu_showById 正确获取item_key 参数为some-item/sub-item,但第二个参数content_id 从未被捕获。

...为什么?

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

【问题讨论】:

    标签: django django-views django-urls


    【解决方案1】:

    第一个正则表达式总是匹配的,所以 content_id 永远不会被拾取。尝试在 urls.py 中切换顺序。

    【讨论】:

      【解决方案2】:

      经验教训:使您的 URL 正则表达式尽可能严格。 scoopseven 的答案是最明显的解决方案,也是定义 URL 的重要规则,但用它来修复这样的事情对我来说有点像 hack,更重要的是,我的 URL 的顺序变成了我不喜欢的顺序。所以我从

      更改了基本URL

      url(r'^menu/(?P&lt;item_key&gt;[a-z/\-]*[a-z])/', views.menu, name='menu')

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

      现在它就像一个魅力。

      【讨论】:

      • 我也打算这么建议。我们不这样做是出于特定原因。假设你得到 /menu/someitemkeythatdoesntmatchregex/somethingelse/,由于 $.这是我们的应用程序所需的行为,您的可能会有所不同。
      • 没错,这非常依赖于应用程序。在这种情况下,无论如何我都会简单地查看 404。但是,是的,我看到细节之后的匹配所有正则表达式也可能很有用。再次感谢您的洞察力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 2015-11-01
      相关资源
      最近更新 更多