本篇博客同样参照追梦人物老师的博客详情页课程,记录自己的学习过程。本篇博客的重点在于自定义URL规则的使用。
-- urls模块中自定义URL --- 从访问路径中获取参数pk
-- 配置视图函数 --- 从urls模块中获取到参数pk,并在视图函数中使用
-- 模型中定义类的get_absolute_url()方法 --- 根据视图函数,并传入参数,解析对应视图函数的url。
-- 在模板html文件中,使用类的get_absolute_url()方法 --- 根据不同的点击,得到不同的url,访问不同的内容。
在blog/urls.py中新增
path('posts//', views.detail, name='detail')
blog/urls.py文件整体变为
from django.urls import path
from . import views
app_name = 'blog' # 告诉程序,当前的url模块属于哪个应用,此处是blog应用 --- 试图函数命名空间
urlpatterns = [
path('', views.index, name='index'),
path('posts//', views.detail, name='detail')
]
其中 app_name = 'blog' 告诉程序,当前的url定义属于blog应用;
新增path行第一个参数为新增的相对访问路径:posts/ n/ ,前缀的域名不需要添加。其中
第三项name='detail'表明该视图函数的别名,在Reverse函数中解析URL时会用到。
def detail(request, pk):
post = get_object_or_404(Post, pk=pk) # 系统定义的pk是关键
return render(request, 'blog/detail.html', context={'post': post})
编写自定义URL对应的视图函数,因为定义的url自带参数,因此在该视图函数中可以使用访问路径中携带的参数pk。
涉及的一个函数: get_object_or_404(Post, pk=pk),表示从数据库中查找满足参数pk=pk的Post类对象,如果不存在则返回404页面错误。
为模型添加get_absolute_url方法,便于调用模型进行url解析
from django.urls import reverse # 域名解析函数
def get_absolute_url(self):
# 解析视图函数detail的URL,参数pk其值为self.pk
return reverse('blog:detail', kwargs={'pk': self.pk})
reverse函数:知道视图函数,反转回其url。
其中第一个参数表示视图函数,格式为 "命名空间:别名",别名在定义url中确定。
第二个参数表示视图函数中的参数,不同的视图函数参数,对应不同的url。此处将当前对象本身的pk作为参数传入。因此get_absolute_url函数不需要额外的参数。
{% for post in post_list %}
..............
{{post.title}}
..............
{% endfor %}
当点击不同Post对象的 标题 或 “继续阅读” 时,会调用对应的get_absolute_url()方法。
解析得到对应的detail视图函数的url,从而访问对应的视图函数。
detail视图函数会返回文章的详情页面。
如果多个模板只有少部分不同,其余部分的都是相同的。那么可以将不同的部分用占位框表示,将多个模板抽象为一个基目标。
base.html:
....共用部分....
{% block main %}
{% endblock main %}
....共用部分....
....共用部分....
其中
{% block main %}
{% endblock main %}
称为占位框,在基模板中预占空间,各子模板继承后进行填充。
{% extends 'base.html' %}
{% block main%}
....子模板内容....
{% endblock main%}
子模版通过{% extends 'base.html' %}基础基模板内容,并在占位框中填充自己的内容。
templates/base.html
{% load static %}
Black & White
Collect from 网页模板
Modified by 追梦人物的博客
{% block main %}
{% endblock main %}
templates/blog/detail.html
{% extends 'base.html' %}
{% block main%}
{{post.title}}
{{post.body}}
发表评论
{% endblock main %}
{% block toc %}
{% endblock toc %}
templates/blog/index.html
{% extends 'base.html' %}
{% block main%}
{% for post in post_list %}
{{post.title}}
{{post.abstract}}
{% empty %}
暂时还没有发布的文章! >
{% endfor %}
{% endblock main%}
评论列表,共 4 条评论