编写视图函数

打开article/views.py,增加文章详情页面的视图函数article_detail()

article/views.py...# 文章详情
def article_detail(request, id):# 取出相应的文章article = ArticlePost.objects.get(id=id)# 需要传递给模板的对象context = { 'article': article }# 载入模板,并返回context对象return render(request, 'article/detail.html', context)
  • article_detail(request, id)函数中多了id这个参数。注意我们在写model的时候并没有写叫做id的字段,这是Django自动生成的用于索引数据表的主键(Primary Key,即pk)。有了它才有办法知道到底应该取出哪篇文章。
  • ArticlePost.objects.get(id=id)意思是在所有文章中,取出id值相符合的唯一的一篇文章。

然后编写article/urls.py,配置路由地址:

article/urls.py...urlpatterns = [...# 文章详情path('article-detail/<int:id>/', views.article_detail, name='article_detail'),
]

<int:id>:Django2.0path新语法用尖括号<>定义需要传递的参数。这里需要传递名叫id的整数到视图函数中去。

重申一下老版本的Django是没有path语法的。

编写模板

templates/article/中新建detail.html文件,编写如下代码:

templates/article/detail.html<!-- extends表明此页面继承自 base.html 文件 -->
{% extends "base.html" %}
{% load staticfiles %}<!-- 写入 base.html 中定义的 title -->
{% block title %}文章详情
{% endblock title %}<!-- 写入 base.html 中定义的 content -->
{% block content %}<!-- 文章详情 -->
<div class="container"><div class="row"><!-- 标题及作者 --><h1 class="col-12 mt-4 mb-4">{{ article.title }}</h1><div class="col-12 alert alert-success">作者:{{ article.author }}</div><!-- 文章正文 --><div class="col-12"><p>{{ article.body }}</p></div></div>
</div>{% endblock content %}

这里我们用{{ article.xxx }}取出了文章标题、作者以及正文。

前面我们已经通过后台创建了几篇文章,这里将取出id为1的一篇文章测试效果。

运行开发服务器后,在浏览器中输入http://127.0.0.1:8000/article/article-detail/1/

优化网页入口

虽然已经实现了文章详情功能,但是通过输入url访问的方式实在太不友好。

改写header.html,让用户可通过导航栏右侧的文章链接返回首页:

templates/header.html...
<div><ul class="navbar-nav"><li class="nav-item"><!-- 改写了这里的 href --> <a class="nav-link" href="{% url 'article:article_list' %}">文章</a></li></ul>
</div>...

注意看这里href是如何改写的:

  • href定义了链接跳转的地址。

  • {% url '...' %}是Django规定的模板解耦语法,用它可以根据我们在urls.py中设置的名字,反向解析到对应的url中去。

    关于其中的'article:article_list'的解释:

  • 前面的article是在项目根目录的urls.py中定义的app的名称

  • 后面的article_list是在app中的urls.py中定义的具体的路由地址

通过这样的方法就将链接跳转的指向给配置好了,只要对应url的名称不变,url本身无论怎么变化,Django都可以解析到正确的地址,很灵活。

当然你也可以直接在href中写入url的地址,但是一旦url有变化,所有相关的链接都会失效,维护性不好。

然后再改写list.html,让用户可点击阅读本文按钮进入文章详情:


...<div class="card-footer"><!-- 同样改写 href --><a href="{% url 'article:article_detail' article.id %}" class="btn btn-primary">阅读本文</a></div>...

留意文章的id是如何传递的:

  • list.html中,通过href="{% url 'article:article_detail' article.id %}",将id传递给article/urls.py
  • article/urls.py中,通过<int:id>传递给视图函数article_detail()
  • 在视图函数article_detail()中,通过形参id取得了文章的id值,并进行处理,最终定位了需要获取的文章对象
    现在我们可以通过链接访问网站上的不同页面了,而不需要手动输入url。当然这也是现代网站的基础。

总结

现在我们也拥有查看文章详情的功能了,并且优化了网页切换的体验。

下一章将学习使用Markdown语法对文章正文进行排版。

创作不易,点个赞吧!!

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://blog.csdn.net/wsad861512140

Django搭建个人博客之如何编写文章相关推荐

  1. Django搭建个人博客:渲染Markdown文章目录

    对会读书的人来说,读一本书要做的第一件事,就是仔细阅读这本书的目录.阅读目录可以对整体内容有所了解,并清楚地知道感兴趣的部分在哪里,提高阅读质量. 博文也是同样的,好的目录对博主和读者都很有帮助.更进 ...

  2. Django搭建个人博客:用django-notifications实现消息通知

    凭借你勤奋的写作,拜读你文章的用户越来越多,他们的评论也分散在众多的文章之中.作为博主,读者的留言肯定是要都看的:而读者给你留言,自然也希望得到回复. 怎么将未读的留言呈现给正确的用户呢?总不能用户自 ...

  3. Django搭建简易博客

    Django简易博客,主要实现了以下功能 连接数据库 创建超级用户与后台管理 利用django-admin-bootstrap美化界面 template,view与动态URL 多说评论功能 Markd ...

  4. 10分钟利用django搭建一个博客

    以前老是听说ROR开发有多快多块,网上还有朋友为了证明这,专门制作了10分钟利用rails框架搭建一个简易博客的教程,最近学习django框架,觉得django给开发者的便捷也很多,心血来潮来写个10 ...

  5. django项目转pyc_Python自动化运维系列:Django搭建小博客

    如何使用Django和Python怎么搭建一个小博客呢? 这是一个简单而困难的问题.简单的原因是,只要做过一次,基本上就能做到举一反三: 困难的原因是有没有用心和耐心去完成这个实验. 如果你成功了,那 ...

  6. 用django搭建个人博客(一)

    用django2.0搭建个人博客 博客网站的需求与规划 该个人博客为简单的入门示范网站,具有以下功能 项目名称为mblog 通过admin管理界面发帖.编辑以及删除贴文,且此界面支持markdown语 ...

  7. Django搭建个人博客(二)

    更换数据表mysql 上文说到编写好了我们的 model 模块,映射生成数据表,之前我们用的是Django 默认的数据库 sqlite3 ,这里我们更改一下使用 mysql. 我们在 navicat ...

  8. Django搭建简易博客教程(四)-Models

    原文链接: http://www.jianshu.com/p/dbc4193b4f95 Django Model 每一个Django Model都继承自django.db.models.Model 在 ...

  9. Django搭建个人博客:上传头像图片

    到目前为止我们的博客处理的都是文字.现代互联网早就进入了"读图"时代,图片的维护.展示也就相当重要. 上一章中预留了avatar字段,用来保存用户上传的头像,现在我们来实现这个功能 ...

最新文章

  1. unity发布安卓黑屏_Unity将携十余爆款新游和多个独立游戏亮相ChinaJoy 2020
  2. php 面向对象开发 类的学习 一
  3. django使用postgresql时提示主键冲突
  4. kali高速更新源以及主题修改方法
  5. html 显示代码块,使用Pre在文章中显示代码块 - 文章教程
  6. win32汇编入门(一)
  7. 数学无用论??我们欠孩子真正的数学阅读
  8. 如何实现服务器转发客户端消息,socket 怎么实现服务器与客户端不停的互发消息呢?...
  9. sealer背后实现整个集群一键交付的奥秘 | 龙蜥技术
  10. 如何看待不会写代码的架构师?
  11. 【java】输入球的半径,求出其体积
  12. 使用CSS 媒体查询功能满足不同屏幕分辨率要求
  13. TF2.0—tf.keras.layers.Lambda
  14. python做服务器需要什么模块_用Python自带的包建立简单的web服务器
  15. 工业机器人编程语言c语言,工业机器人编程语言和编程方式
  16. Android 音频系统:从 AudioTrack 到 AudioFlinger
  17. RHEL7配置中文输入法-智能拼音
  18. 快来直播:坦然面对东方甄选与股价跌宕起伏
  19. android backtrace,高通android q 通过backtrace使用addr2ine工具定位crash问题记录
  20. 文献管理软件Zotero配置及使用

热门文章

  1. 浅谈Excel开发:一 Excel 开发概述
  2. java检测服务器之间网络状况及丢包率
  3. 2021年熔化焊接与热切割找答案及熔化焊接与热切割模拟考试软件
  4. 基于 Netbios 发现内网存活主机
  5. Python数学建模系列(八):图论
  6. 项目经理必备的6个项目估算方法
  7. React前端转PDF
  8. 双减之下,在线教育的量骤减,分享一下12种WebRTC有趣的用法
  9. 清科-2018年中国投行/券商排名
  10. 地球币的一些基本参数2013