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

Shu*_*kar 2 python django

我有这个post_list.html文件:(忽略第二个'blog:post_detail'网址)

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

urls.py中,我尝试通过以下方式使用re_path

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

当我运行服务器时,我在/错误获取NoReverseMatchReverse for 'post_detail' with arguments '(1,)' not found. 1 pattern(s) tried: ['posts/<int:pk>/$']


但是如果我更换re_path网址,并<int:pk>(?P<pk>\d+)它完美:

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

Dan*_*man 5

您使用了错误的功能。re_path是的别名url,因此它使用旧的regex语法。如果要使用新语法,请使用path


Jay*_*Tam 5

因为你的 Django 不是 2.0+

Django >=2.0

django 2.0 推荐使用路径

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

如果你想使用正则表达式,比如 django<2.0

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

Django<2.0

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