get_absolute_url:找不到“文章详细信息”的反向错误

Posted

技术标签:

【中文标题】get_absolute_url:找不到“文章详细信息”的反向错误【英文标题】:get_absolute_url: error of Reverse for 'article-detail' not found 【发布时间】:2020-12-11 14:08:28 【问题描述】:

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

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__'

【问题讨论】:

% url 'post:article-detail' post.pk % 请改成%url 'post:article-detail' request pk=post.pk % 是我的建议 我认为get_absolute_url 中的args 应该是一个元组而不是一个集合。尝试这个。 return reverse('article-detail', args=(str(self.id)),)return reverse('article-detail', args=[str(self.id))] 【参考方案1】:

如果你改变这个

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

到这里

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

您不会收到错误消息,但您也不会被重定向到您刚刚发布的帖子。

因此,如果您的目标是摆脱这个错误,但不关心之后重定向到哪里,那么这就是您的解决方案。

【讨论】:

【参考方案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>

这里我们在templatehelpers.py(模板标签)中使用了一个新的简单标签,即abs_url(绝对url)。 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)

【讨论】:

请加你views.py文件。 添加 app_name 重要吗?

以上是关于get_absolute_url:找不到“文章详细信息”的反向错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 get_absolute_url() 的 NoReverseMatch 错误

在 Django auth 中设置 `get_absolute_url`

get_absolute_url无效

get_absolute_url 中的 django 完整 url

在 JSON 输出中包含 get_absolute_url 值

为啥 django page cms get_absolute_url 返回一个空字符串?