我一直在练习Djnago,为此,我建立了一个博客。在构建过程中,在使用以下代码时,我遇到了一个错误:
<a href="{% url 'blog_post' post.slug %}">
{{ post.title }}
</a>
在学习和学习其他课程时,类似的事情会很好。但是现在,它将引发这个例外:NoReverseMatch.
不过,如果我使用这段代码,它就会运行得很好:
<a href="{{ post.slug }}">
{{ post.title }}
</a>
虽然在不同的项目中工作,第一种方式会很好,但这一次,它没有。
我的问题是为什么?
下面是我的urls、和我的视图中的代码。也许错误就在这里,而不是其他地方。
如果有人能解释为什么会发生这种事,或者我哪里出了问题,我们会非常感激的
urls
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.blog_index, name='blog_index'),
path('<slug:post_slug>/', views.blog_post, name='blog_post'),
]
视图
from django.shortcuts import render
from .models import Post
# Create your views here.
def blog_index(request):
posts = Post.objects.order_by('-
created').filter(published=True)
data = {
'posts': posts
}
return render(request, 'blog/post_list.html', data)
def blog_post(request, post_slug):
post = Post.objects.get(slug=post_slug)
data = {
'post': post
}
return render(request, 'blog/post_detail.html', data)
发布于 2021-10-06 05:15:01
尝试this.your的问题是,您的urls.py中有一个名称空间,而在href中,您应该添加那个名称空间(‘blog’)。
<a href="{% url 'blog:blog_post' post.slug %}">
{{ post.title }}
</a>
这
<a href="{{ post.slug }}">
{{ post.title }}
</a>
上面的代码之所以有效,是因为您位于主页中,当您在a标记中添加此代码(href=“{ post.slug }”)时,它将只调用当前的url +“/<‘段塞:post_ url.but /’,这是一个有效的url.but,这是一个非常糟糕的option.use --第一个选项。
要了解这一点,请参阅此https://docs.djangoproject.com/en/3.2/topics/http/urls/#url-namespaces。
发布于 2021-10-06 06:11:04
在这种情况下,您应该使用:https://docs.djangoproject.com/en/3.2/ref/models/instances/#get-absolute-url,模板中的逻辑越少,应用程序就越好。很难编写包含在模板中的逻辑测试。
您应该向模型中添加一个方法:
from django.urls import reverse
class Post()
...
def get_absolute_url(self):
return reverse('blog:blog_post', kwargs={'post_slug' : self.slug})
在反向函数中,需要添加应用程序命名空间。在你的情况下,这是个博客。https://docs.djangoproject.com/en/3.2/topics/http/urls/#introduction
然后在模板中使用:
{{ post.get_absolute_url }}
来自文件:
这里的逻辑是,如果您更改对象的URL结构,即使是一些小的东西,比如纠正拼写错误,您也不需要跟踪可能创建的URL的每个位置。在get_absolute_url()中指定一次,并让所有其他代码调用一个位置.
https://stackoverflow.com/questions/69460144
复制相似问题