NoReverseMatch虽然get_absolute_url返回正确的URL

时间:2016-06-12 11:29:31

标签: django url

我试图在Post模型中使用带有kwargs的get_absolute_url。

在我的模型中,我得到了slug字段和get_absolute_url

的以下代码
class Post(models.Model):
......
......


    def get_absolute_url(self):
        return reverse('post_detail',kwargs={'pk':self.id, 'slug':self.slug})
urls.py

中的

url(r'^p/(?P<pk>\d+)/(?P<slug>[\w.@+-]+)/$',PostDetailView.as_view(),name='post_detail')

在我的模板中我得到了:

     <ul>
    {% for post in object_list %}
    <li>
      <a href="{% url post.get_absolute_url %}">
        <b>{{ post.title}}</b> 
      </a>
    </li>
    {% endfor %}
  </ul>

当我使用时:python manage.py shell

from website.models import Post
p = Post.objects.first()
p.get_absolute_url()
# returns this
u'/p/1/this-is-a-test/'

它返回正确的URL,即/ p / 1 / this-is-test / 但是当我在像<{1}}这样的模板中使用它时,它会返回NoReverseMatch。

我在这里检查了很多问题并复制了答案,但它没有用。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您不应该使用url模板标记。就这样做:

<a href="{{ post.get_absolute_url }}"></a>

您当前的代码导致reverse被调用两次,一次在get_absolute_url内,一次调出get_absolute_url。这就是它失败的原因。