Django 2.0中re_path搭配<str:pk>在CreateView失效,求原因及解决方法
问题原因与解决办法
别担心,新手刚接触Django路由的时候踩这个坑太正常啦!咱们来一步步拆解问题:
核心原因
你混淆了Django里两种路由函数的语法:
re_path()是基于正则表达式的路由写法,它不支持<str:pk>这种路径转换器语法(这是path()函数专属的)。<str:pk>是path()用来捕获URL参数的简洁写法,没法直接在正则路由里用。
两种解决办法
方法1:换成推荐的 path() 函数(更简单)
Django 2.0+ 官方更推荐用 path() 处理常规路由,你的写法只需要把 re_path 改成 path 就能正常工作:
path('<str:pk>/', indexView.as_view(), name='index')
方法2:如果坚持用 re_path(),改用正则命名分组
如果你的场景确实需要正则表达式的灵活性,就得用正则的命名捕获分组语法来替代路径转换器:
re_path(r'^(?P<pk>[^/]+)/$', indexView.as_view(), name='index')
这里 (?P<pk>[^/]+) 的意思是:
(?P<pk>...):给捕获到的内容命名为pk,这样视图里就能通过self.kwargs['pk']获取到这个参数[^/]+:匹配任意非斜杠的字符,和<str:pk>的效果一致
小提示
如果没有特别复杂的正则匹配需求,优先用 path() 就好,它的语法更直观,不容易出错~
内容的提问来源于stack exchange,提问作者Mohamed Benkedadra
相关产品推荐
相关产品推荐

