django - 使用 Django 2.0 捕获组
问题描述
我正在关注有关创建 Django 应用程序的旧教程。在关于修改页面 URL 的部分中,本教程使用正则表达式和捕获组将 URL 中的参数传递给视图。
我使用的是 Django 2.0,所以我使用的是path
而不是url
,我想知道正则表达式的正确替换是什么。我现在已经通过使用来解决它re_path
,但我想知道它应该如何在 Django 2.0 中实际完成。
旧代码是:
url(r'([^/]*)', views.index, name='index'),
我已经做了很多尝试来适应路径,包括(pagename
是index
函数中的参数):
path('/<pagename>', views.index, name='index'),
path('/<str:pagename>', views.index, name='index'),
path('/<str:pagename>/', views.index, name='index'),
等等。我能想出的排列都不起作用,每次都出现 404 错误。
解决方案
让我们先来看看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'),
推荐阅读
- android - 未在edittext上设置第一项以外的数组项
- multithreading - pthread_cancel() 之后,pthread_join() 函数调用挂断
- c - ssscanf 意外行为
- jquery - 如何设置不同的固定列数据表
- json - 转换没有根名称的 JSON 对象
- ruby-on-rails - Rails 使用模型,命名空间并连接到不同的数据库
- visual-c++ - 如何检测雨滴的模糊边缘?
- redis - 查询使用 ReJSON 保存的 json 数据
- android - 开启 Hyper-V 的 Android 开发
- php - Laravel 内连接查询