【问题标题】:get_absolute_url: error of Reverse for 'article-detail' not foundget_absolute_url:找不到“文章详细信息”的反向错误
【发布时间】: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))]

标签: django django-models django-forms django-templates django-class-based-views


【解决方案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 重要吗?
    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多