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 中的 django 完整 url