首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Django模板中使用{% url ...%} vs {{ .}

在Django模板中使用{% url ...%} vs {{ .}
EN

Stack Overflow用户
提问于 2021-10-06 05:13:02
回答 2查看 132关注 0票数 1

我一直在练习Djnago,为此,我建立了一个博客。在构建过程中,在使用以下代码时,我遇到了一个错误:

代码语言:javascript
运行
复制
<a href="{% url 'blog_post' post.slug %}">
    {{ post.title }}
</a>

在学习和学习其他课程时,类似的事情会很好。但是现在,它将引发这个例外:NoReverseMatch.

不过,如果我使用这段代码,它就会运行得很好:

代码语言:javascript
运行
复制
<a href="{{ post.slug }}">
    {{ post.title }}
</a>

虽然在不同的项目中工作,第一种方式会很好,但这一次,它没有。

我的问题是为什么?

下面是我的urls、和我的视图中的代码。也许错误就在这里,而不是其他地方。

如果有人能解释为什么会发生这种事,或者我哪里出了问题,我们会非常感激的

urls

代码语言:javascript
运行
复制
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'),
]

视图

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-06 05:15:01

尝试this.your的问题是,您的urls.py中有一个名称空间,而在href中,您应该添加那个名称空间(‘blog’)。

代码语言:javascript
运行
复制
<a href="{% url 'blog:blog_post' post.slug %}">
    {{ post.title }}
</a>

代码语言:javascript
运行
复制
 <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

票数 4
EN

Stack Overflow用户

发布于 2021-10-06 06:11:04

在这种情况下,您应该使用:https://docs.djangoproject.com/en/3.2/ref/models/instances/#get-absolute-url,模板中的逻辑越少,应用程序就越好。很难编写包含在模板中的逻辑测试。

您应该向模型中添加一个方法:

代码语言:javascript
运行
复制
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

然后在模板中使用:

代码语言:javascript
运行
复制
{{ post.get_absolute_url }}

来自文件:

这里的逻辑是,如果您更改对象的URL结构,即使是一些小的东西,比如纠正拼写错误,您也不需要跟踪可能创建的URL的每个位置。在get_absolute_url()中指定一次,并让所有其他代码调用一个位置.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69460144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档