我创建这样的路线:
urlpatterns = [
re_path(r'(?:(?P<slug>.*?)?/)?', views.IndexView.as_view(), name='index_url'),
]
调用此类 url 时必须引用此模板:
/ #Переменная slug=None
/some-slug/ #Переменная slug='some-slug'
/some-slug #Переменная slug='some-slug'
但是,您需要使用以下网址提供 404:
/some-slug/321
/some-slug/fdsf/3213/asd/
И т.д.
我无法得到这个正则表达式。
我的原则上可以工作,但由于某种原因,它会在 slug 模式本身之后使用所有字符。也就是说,这样的页面/some-slug/fdsf/3213/asd/将被重定向到视图,但所需的值将被写入 slug。并且有必要不对其进行重定向。
正则表达式
(?:(?P<slug>.*?)?/)?缺少字符^和$,它们分别表示字符串的开头和结尾。此外,字符匹配.任何字符,甚至/,所以即使在添加^/$之后,也会有匹配/some-slug/fdsf/3213/asd/。要匹配除字符以外的任何字符/,您可以使用独占字符类[^/]。利用
请参阅regex101.com 上的演示。
细节
^- 线的开始(?P<slug>[^/]*)- 组slug:零个或多个字符,除了//?- 一个或零个字符/$- 行结束。尽管如此,这是我的一个错误。这都是关于错误的正则表达式。
通过测试,使用站点regex101,我推导出了我的正则表达式。也许它对某人有用或只是好奇,在这里: