Django (?P<pk>\d+) vs <int:pk>

5
我有这个 post_list.html 文件:(忽略第二个 'blog:post_detail' 的 URL)
{% for post in post_list %}
  <h1><a href="{% url 'blog:post_detail' post.pk %}">{{ post.title }}</a></h1>
  <div class="date">
    <p>Published on: {{post.published|date:"D M Y"}}</p>
  </div>
  <a href="{url 'blog:post_detail' post.pk}">Comments: {{post.approve_comments.count}}</a>
{% endfor %}

urls.py 文件中,我正在尝试以以下方式使用 re_path

re_path(r'^posts/<int:pk>/$', views.PostDetailView.as_view(), name='post_detail'),

当我运行服务器时,出现了无法找到反向匹配/的错误:尝试使用模式“posts/<int:pk>/$”,但未发现参数为“(1,)” 的“post_detail”反向匹配。
然而,如果我将re_path替换为url,将<int:pk>替换为(?P<pk>\d+),它就可以完美地工作:
url(r'^posts/(?P<pk>\d+)/$', views.PostDetailView.as_view(), name='post_detail'),
2个回答

6

因为您的Django版本不是2.0以上

Django >=2.0

Django 2.0推荐使用path路径

path(r'^posts/<int:pk>/$', views.PostDetailView.as_view(), name='post_detail')

如果你想要使用正则表达式,就像Django<2.0那样

re_path(r'^posts/(?P<pk>\d+)/$', views.PostDetailView.as_view(), name='post_detail'),

django<2.0

url(r'^posts/(?P<pk>\d+)/$', views.PostDetailView.as_view(), name='post_detail'),

5
您使用了错误的函数。re_pathurl的别名,因此它使用旧的正则表达式语法。如果您想要使用新的语法,请使用path

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接