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
接下来开发侧边栏的内容。