Django实战:搭建个人博客(四)

Django实战:搭建个人博客(四)

开发文章详情页

1. URL绑定

blog/url.py中添加detail视图函数的匹配规则:

urlpatterns = [
    path('', views.index, name='index'),
    # pk会作为第二个参数传给detail视图函数,其中第一个参数是request
    # <int:pk>,<string:st>等是Django的路由写法
    path('post/<int:pk>',views.detail,name='detail')
]

2. detail视图函数

views.py中添加如下,其中get_object_or_404方法可以按主键查询数据库中的数据,不存在则返回404 response。

from django.shortcuts import render,get_object_or_404
def detail(request,pk):
    post=get_object_or_404(Post,pk=pk)
    return render(request,'blog/detail.html',context={
        'post':post
    })

为Post模型定义get_absolute_url方法:

def get_absolute_url(self):
    # reverse函数找到blog应用的urlpatterns中,名为detail的url,并传入kwargs中的参数,返回这个url
    # 通过这种解析url的方式,使得url与视图函数的绑定更加灵活,实现了url与模型实例的关联
    return reverse('blog:detail', kwargs={'pk': self.pk})

3. 模板继承的使用方法

由于文章详情页与文章目录页大部分内容相同,因此采用模板继承的方式。

在templates/目录下新建一个base.html,其中嵌入如下结构:

<main class="col-md-8">
{% block main %}
{% endblock %}
</main>

<aside class="col-md-4">
{% block aside %}
{% endblock %}
</aside>

在templates/blog/detail.html中,首部通过{%extends 'base.html'%}语句表明继承关系,再写block内部的细节

{%extends 'base.html'%}
{%block main%}
# 此处填写main标签里的细节,例如:
	<body>
		<h1 class="entry-title">{{post.title}}</h1>  # post由detail视图函数传递给模板
	</body>
{%end block%}

{%block aside%}
# 此处编写aside标签(侧边栏相关的内容)的细节
{%end block%}

通过这种方式可以实现模板继承,类似于子模板detail.html覆写了父模板base.html中block包裹的部分。

4. 从目录页到详情页的跳转

在index.html的文章标题和“继续阅读”处调用刚才定义的{{ post.get_absolute_url }}模板变量,获取所点击文章的url(模板变量不仅可以是模型的属性,也可以是一个可调用的方法)

<a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
<a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav"></span></a>

5. 详情页内容的填充

通过模板变量对模板进行填充,以正文body为例:

<div class="entry-content clearfix">
    {{ post.body }}
</div>

知识点总结

  • 视图函数
  • 模板继承
  • 逆向解析文章的url

接下来开发侧边栏的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值