【问题标题】:Django url expression variable is returning the remainder of the urlDjango url 表达式变量正在返回 url 的其余部分
【发布时间】:2017-07-10 09:09:50
【问题描述】:

在我的 urls.py 中有一个 url 表达式,我需要在其中获取视图中主题的名称。

url(r'^notebook/(?P<subject>.+?)/new/entry/$', view, name)

但是,这不仅会返回主题,还会返回以下 url。 IE: chemistry/new/entry 我怎样才能让它只返回 chemistry?

编辑: 一般来说,我的 urls.py 也可能存在问题。似乎它可能会触发主题视图。以下是相关代码:

# urls.py
urlpatterns = [
    url(r'^notebook/(?P<subject>.+?)/$', views.subject, name='subject'),
    url(r'^notebook/(?P<subject>[^/]+)/new/entry/$', views.NewEntryView.as_view(), name='new_entry'),
]

【问题讨论】:

  • 你的网址是这样的notebook/chemistry/new/entry/new/entry/ 吗?或者你真的指的是subject arg ?
  • 添加相关的view代码?
  • 用网址编辑。现在两者的观点只是 subject = Subject.objects.all().get(name=subject)

标签: python regex django


【解决方案1】:

网址被更具攻击性(尽管不是贪婪)的模式拦截:

url(r'^notebook/(?P<subject>.+?)/$', views.subject, name='subject')

请注意,第二个模式是这个模式的子集。

您应该切换 url 模式的顺序,以便 Django 首先处理更受限制的 url:

urlpatterns = [
    url(r'^notebook/(?P<subject>[^/]+)/new/entry/$', views.NewEntryView.as_view(), name='new_entry'),
    url(r'^notebook/(?P<subject>.+?)/$', views.subject, name='subject'),
]

或者把第一个改成否定字符类,这样斜线就不匹配了:

url(r'^notebook/(?P<subject>[^/]+)/$', views.subject, name='subject')

【讨论】:

  • 你称这种模式为贪婪。将来有什么更好的方法来防止此类事情发生? - 编辑注明感谢
  • @mei 错字,不要贪心。使用否定字符类。
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2013-07-26
  • 2014-07-08
相关资源
最近更新 更多