get_absolute_url:未找到 'article-detail' 的反向错误

get_absolute_url: error of Reverse for 'article-detail' not found

我正在使用基于 class 的视图来创建 post。单击 post 后,我使用 get_absolute_url 转到了 post 页面,但它给出了没有反向匹配的错误。 这是我的模特

from django.db import models

from django.conf import settings

from django.urls import reverse

# Create your models here.
 class BlogPost(models.Model):
     title = models.CharField(max_length = 50 , null=False,blank=False)
    body = models.TextField(max_length = 5000 , null=False,blank=False)
    date_published = models.DateTimeField(auto_now_add=True)
   date_update = models.DateTimeField(auto_now_add=True)
   author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

   def __str__(self):
        return self.title

   def get_absolute_url(self):
         return reverse('article-detail', args=(str(self.id)))

这是我的 urls.py:

urlpatterns = [
         path('',views.home,name="home"),
         path('home2/',HomeView.as_view(),name = "home2"),
         path('article/<int:pk>',ArticleDetailView.as_view(),name = "article-detail"),
         path('add_post/',AddPostView.as_view(),name="add_post"),
      ]

这是home2.html:

  <ul>
    {%for post in object_list %}
     <li><a href="{%url 'post:article-detail' post.pk %}">{{post.title}}</a>-{{post.author}}<br/>
     {{post.body}}</li>
    {%endfor%}
  </ul>

这是views.py:

from django.shortcuts import render
from .models import *
from .forms import *
from django.views.generic import ListView,CreateView
from django.views.generic.detail import DetailView
# Create your views here.
def home(request):
    return render(request,'post/home.html')

class HomeView(ListView):
         model = BlogPost
         template_name = "post/home2.html"

 class ArticleDetailView(DetailView):
          model = BlogPost
         template_name = "post/article_details.html"
         context_object_name = 'post'

 class AddPostView(CreateView):
          model = BlogPost
           template_name = "post/add_post.html"
           fields = '__all__'

我建议做类似的事情。我提供2个方法。

第一种方法:

通过使用get_absolute_url

 from django.urls import reverse
 def get_absolute_url(self):
    return reverse('post:article-detail', args=(self.id)) #post is the app_name

urls.py

url(r'^article/(?P<pk>\d+)/$', ArticleDetailView.as_view(), name='article-detail'),

home2.html

<ul>
   {%for post in object_list %}
     <li>
        <a href="{{post.get_absolute_url}}">{{post.title}}</a>-{{post.author}}<br/>{{post.body}}
     </li>
   {%endfor%}
</ul>

第二种方法:

通过使用 template tag。这里在 template tag 的帮助下得到 absolute url

home2.html

{% load templatehelpers %}
<ul>
{%for post in object_list %}
   <li>
      <a href="{% abs_url 'app_name:article-detail' request pk=post.pk %}">{{post.title}}</a>-{{post.author}}<br/>
     {{post.body}}
   </li>
{% endfor %}
</ul>

这里我们使用一个新的简单标签即abs_url(绝对url)在templatehelpers.py(模板标签)。 app_name 是应用程序的名称。

templatehelpers.py

from django import template
from django.urls import reverse
register = template.Library()

@register.simple_tag
def abs_url(value, request, **kwargs):
    return reverse(value,kwargs=kwargs)

如果你改变这个

def get_absolute_url(self):
         return reverse('article-detail', args=(str(self.id)))

至此

def get_absolute_url(self):
         return reverse('home')

您不会收到错误,但您也不会被重定向到您刚刚 post 编辑的 post。

因此,如果您的目标只是消除此错误,而不关心之后重定向到哪里,那么这就是适合您的解决方案。