首页 > 解决方案 > 使用 Django 2.0 捕获组

问题描述

我正在关注有关创建 Django 应用程序的旧教程。在关于修改页面 URL 的部分中,本教程使用正则表达式和捕获组将 URL 中的参数传递给视图。

我使用的是 Django 2.0,所以我使用的是path而不是url,我想知道正则表达式的正确替换是什么。我现在已经通过使用来解决它re_path,但我想知道它应该如何在 Django 2.0 中实际完成。

旧代码是:

url(r'([^/]*)', views.index, name='index'),

我已经做了很多尝试来适应路径,包括(pagenameindex函数中的参数):

path('/<pagename>', views.index, name='index'),
path('/<str:pagename>', views.index, name='index'),
path('/<str:pagename>/', views.index, name='index'),

等等。我能想出的排列都不起作用,每次都出现 404 错误。

标签: djangodjango-2.0capturing-group

解决方案


让我们先来看看url(..)

url(r'([^/]*)', views.index, name='index'),

这意味着您接受具有零个或多个斜杠字符的每个路径(这就是[^/]意思,这意味着一个字符组包含除斜杠字符之外的所有字符,而Kleene *表示零个或多个 repittons)。

现在通常在 Django 中,在末尾添加一个斜杠,但路径不应斜杠开头。所以path(..)应该工作的是:

path('<str:pagename>/', views.index, name='index'),

由于str也不接受斜线,因此两者现在是等价的,除了str应该包含至少一个字符这一事实。例如,我们也可以使用两个path(..)s 来包含空字符串:

path('', views.index, name='index', kwargs={'pagename': ''}),
path('<str:pagename>/', views.index, name='index'),

推荐阅读