Django:什么是正确的href到单个URL?

时间:2018-11-30 15:36:31

标签: python django

我有一个模型Post。每个帖子都扩展post_detail.html并有自己的网址:

urlpatterns = [
    path('news/<int:pk>/', views.PostDetailView.as_view(), name='news_page'),
...
]

该模型由标题,描述,图像等组成。在main.html上,显示最后一个帖子,第二个最后一个帖子和最后一个第三个帖子的标题和图像。我的views.py看起来像

class PostListView(ListView):
    model = Post
    template_name = 'html/main.html'

    def get_context_data(self, **kwargs):
        posts = Post.objects.all().order_by('-id')
        kwargs['last_post'] = posts[0]
        kwargs['second_last_post'] = posts[1]
        kwargs['third_last_post'] = posts[2]
        return super().get_context_data(**kwargs)

在这里,我的模板中有最后一个帖子的标题和倒数第二个帖子:

<h5 href="#">{{ last_post.title }}</h5>

<h5 href="#">{{ second_last_post.title }}</h5>

现在,我想将这些标题连接到自己的网址。我的意思是,当我单击main.html中最后一篇文章的标题时,我想打开该文章的单独网址。我该怎么办?

1 个答案:

答案 0 :(得分:5)

第一步,您可以使用pk来构建URL:

url

接下来,您可以使用<h5 href="{% url 'news_page' last_post.pk %}">{{ last_post.title }}</h5> 标签

from django.urls import reverse

class Post(models.Model):
    ...

    def get_absolute_url(self):
        return reverse('news_page', args=[self.pk])

最后,如果您定义了get_absolute_url方法,

<h5 href="{{ last_post.get_absolute_url }}">{{ last_post.title }}</h5>

然后您可以在模板中使用它:

app_name='posts'

最后是关于名称空间的注释:您尚未显示完整的URL配置,但是如果您使用的是名称空间,例如{% url posts:news_page last_post.pk %},那么当您反转网址时,您将需要包含名称空间,例如{{1}中的reverse('posts:news_page', args=[self.pk])