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

时间:2018-05-07 16:19:59

标签: python django

我有 post_list.html 文件:(忽略第二个'博客: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'),

当我运行服务器时,我收到 NoReverseMatch at / 错误:Reverse for 'post_detail' with arguments '(1,)' not found. 1 pattern(s) tried: ['posts/<int:pk>/$']

但是,如果我将 re_path 替换为 url ,将<int:pk>替换为(?P<pk>\d+),则效果非常好:

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

因为你的django不是2.0 +

django&gt; = 2.0

django 2.0推荐使用路径

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

如果你想使用正则表达式,比如django&lt; 2.0

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

的django&LT; 2.0

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