文章目录
一、本次任务
- 可以跳转博客详情页
- 学习页面模板语法
二、思路梳理
根据前端用户的操作,看后端如何串起来流程。作者用的是后面一种,亲测第一种逻辑是可行的。
blog/models.py
增加获取url方法get_absolute_url()
,这里的 detail 对应的是 url path 中的name
属性的值。
blog/urls.py
- 视图函数命名空间:
app_name = 'blog'
- 配置访问博客详情页
path('blog/detail/<int:pk>/', views.detail, name='detail')
- 注意:不写
app_name = 'blog'
报错:
blog/views.py
注意:get_object_or_404()
方法中参数传递的问题,pk=pk
, 如果只写 pk 报错:
页面视图
templates/blog/index.html
- 把博客的 title 和继续阅读改成详情页的地址
- 两种写法都可以实现点击进入详情页的
<a href="{{ post.get_absolute_url }}">{{ post.title }}</a> <a href="blog/detail/{{ post.pk }}">{{ post.title }}</a>
templates/blog/detail.html
- 由博客模板的single.html 改名后得来,修改固定值为从取值
代码简洁之道:提取页面模板 base.html
- 提取页面中公共的部分,写成 base.html,其他页面中引入就行,减少修改 css,js的路径问题,提高效率。
<!-- 在 base.html 中不同的地方用模板代替,占位而已 -->
<main class="col-md-8">
{% block main %}
{% endblock main %}
</main>
<aside class="col-md-4">
{% block toc %}
{% endblock toc %}
...
</aside>
<!-- 引入公共的部分到 detail.html -->
{% extends 'base.html' %}
models.py 没有需要同步到数据的,所以不需要执行数据迁移命令。
三、提出问题
- urls.py 中的 path 的name什么意思?
- 测试发现,这里的
name
是一个别名吧,如果哪里需要用到地址,就是使用这个name
找到的。
- 测试发现,这里的
- 直接链接 url 跟方法不可以吗,为什么非要多一步
get_absolute_url()
?
附上 Gitee 地址:https://gitee.com/langxing/HelloDjango-blog-tutorial