改写视图函数

上一章我们感受了视图的工作流程。

为了让视图真正发挥作用,改写article/views.py中的article_list视图函数:

article/views.pyfrom django.shortcuts import render# 导入数据模型ArticlePost
from .models import ArticlePostdef article_list(request):# 取出所有博客文章articles = ArticlePost.objects.all()# 需要传递给模板(templates)的对象context = { 'articles': articles }# render函数:载入模板,并返回context对象return render(request, 'article/list.html', context)

代码同样很直白,分析如下:

  • .models表示从当前文件夹的models.py文件中导入ArticlePost数据类
  • ArticlePost.objects.all()ArticlePost数据类获得所有的对象(即博客文章),并传递给articles变量
  • context定义了需要传递给模板的对象,即articles
  • 最后返回了render函数:

    • 第一个变量是固定的request对象,照着写就可以
    • 第二个变量定义了模板文件的位置、名称,即article/list.html
    • 第三个变量定义了需要传入模板文件的对象,即context

视图函数这样就写好了。

编写模板(template)

在前面的视图中我们定义了模板的位置在article/list.html,因此在根目录下新建templates文件夹,再新建article文件夹,再新建list.html文件,即:

my_blog
│  ...
├─article
│  ...
└─my_blog
│  ...
└─templates└─ article└─ list.html

细心的你肯定注意到了,之前的Django文件后缀都是.py,代表Python文件;这里的模板文件后缀是.html,这又是什么呢?

HTML是一种用于创建网页的标记语言。它被用来结构化信息,标注哪些文字是标题、哪些文字是正文等(当然不仅仅这点功能)。也可以简单理解为“给数据排版”的文件,跟你写文档用的Office Word一样一样的 。

list.html文件中写入:

templates/article/list.html{% for article in articles %}<p>{{ article.title }}</p>
{% endfor %}

作为一个Web框架,Django通过模板来动态生成HTML,其中就包含描述动态内容的一些特殊语法:

  • {% for article in articles %}articles为视图函数的context传递过来的对象,即所有文章的集合。{% for %}循坏表示依次取出articles中的元素,命名为article,并分别执行接下来操作。末尾用{% endfor %}告诉Django循环结束的位置。
  • 使用.符号来访问变量的属性。这里的article为模型中的某一条文章;我们在前面的ArticlePost中定义了文章的标题叫title,因此这里可以用article.title来访问文章的标题。
  • <p>...</p>即为html语言,中间包裹了一个段落的文字。

在上一章中已经定义好了urls.py,因此不再需要改动。

一切都很好,深吸一口气。保存所有文件,在浏览器中输入地址http://127.0.0.1:8000/article/article-list/,得到以下错误:

似乎成功从来都不会很顺利。

错误分析

虽然出错了,但幸运的是Django提供了非常完善的错误处理系统,方便开发者快速找到Bug的蛛丝马迹。

第一行就醒目地提示:TemplateDoesNotExist,说明Django没有找到list.html这个文件。仔细检查目录、文件的名称无误,没问题就往下继续看。

然后发现有这么两行:

...django\contrib\admin\templates\article\list.html (Source does not exist)
...django\contrib\auth\templates\article\list.html (Source does not exist)

似乎Django在这两个位置搜索,没有发现需要的文件,然后返回了“未发现模板文件”的错误。

定位了问题的所在,接下来就是在哪里“告诉”Django我的模板的位置呢?

答案就在settings.py中了,它保存了Django项目的各种初始配置。

打开并找到这一段,加入代码os.path.join(BASE_DIR, 'templates')

my_blog/settings.pyTEMPLATES = [{...# 定义模板位置'DIRS': [os.path.join(BASE_DIR, 'templates')],...},
]

这就是说模板文件在项目根目录的templates文件夹中,去找找吧。

很好,保存文件,重新启动服务器,刷新浏览器,如下:



成功!

虽然简陋,但是已经完全走通了MTV(model、template、view)整个环路。

不要激动,精彩的还在后面。

总结

本章我们重写了视图,编写了简单的模板,和前面的模型成功关联起来。

下一章将学习编写一个漂亮的网页模板。

  • 有疑问请在杜赛的个人网站留言,我会尽快回复。
  • 或Email私信我:dusaiphoto@foxmail.com
  • 项目完整代码:Django_blog_tutorial

转载请告知作者并注明出处。

Django搭建个人博客:改写View视图相关推荐

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

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

  2. Django搭建简易博客

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

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

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

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

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

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

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

  6. Django搭建个人博客:给文章加个漂亮的标题图

    现在虽然博客的功能大都实现了,但是界面还是比较朴素,特别是首页的文章列表几乎全是文字,看多了难免疲劳.因此,给每个文章标题配一张标题图,不仅美观,用户也能通过图片快速了解文章内容.实际上大部分社交网站 ...

  7. django搭建个人博客(一)

    准备阶段 首先熟悉项目的根本流程,下面是对项目的每个模块流程阶段具体分析 模块 功能 注册 图形验证.短信验证 登陆 状态保存.cookie.session 个人中心 图片上传.更新数据 发布博客 数 ...

  8. Django搭建个人博客Blog-Day05

    创建文章模块 创建文章app 在虚拟环境中,apps路径下使用如下代码: # 进入虚拟环境 workon wsl # 进入要创建app的路径下 cd blog/blog/apps # 创建app py ...

  9. Django搭建个人博客:用户的登录和登出

    用户管理 用户数据可以说是大部分网站最重要的资产.用户管理就是对用户数据进行增删改查等操作的功能,自然也就非常的重要了. 本章开始学习用户管理的内容,首先从用户登录开始. 在Django中用app来区 ...

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

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

最新文章

  1. TFS 2008 中文版下载及安装完整图解
  2. 关于sql中去换行符的问题
  3. Windows 2000 Active Directory FSMO 角色
  4. linux操作系统分区图解,图解磁盘分区介绍(超经典)
  5. java 热布署 开源_一种简单快捷的 java 热部署方式
  6. 关于TP中的M()方法与D()方法
  7. mysql sql优化及注意事项
  8. CitrixVDI新版动手实验手册
  9. Exchange2003 备份与还原
  10. php实战视频教程 帝国cms二次开发,PHP实战视频教程,帝国CMS二次开发之完成首页模板的制作.ppt...
  11. javaweb网上人才招聘系统的设计与实现
  12. 关闭”xx程序已停止工作”提示窗口
  13. Intel8251可编程串行扩展RS232串口
  14. 人脸识别SVM算法实现--参考麦子学院彭亮机器学习基础5.2
  15. linux下安装php并配置运行环境
  16. 理解Nurbs曲线/曲面的参数空间
  17. 免费开源动画制作软件推荐(新手必备)
  18. Eclipse15:Filter
  19. bad SQL grammer []; nested exception is java.sql.SQLSyntaxErrorException:ORA-00918:未明确定义列
  20. OpenHarmony NXP S32K148移植日记

热门文章

  1. 4.MySQL优化---多表查询优化
  2. [BZOJ1999][codevs1167][Noip2007]Core树网的核
  3. dbca:Exception in thread main java.lang.UnsatisfiedLinkError: get
  4. windows 与linux实现文件共享
  5. EasyRecovery如何恢复系统镜像
  6. unittest 测试
  7. 【Notification】屏蔽特定应用的通知提示
  8. curl上传图片的大坑
  9. 配置一个强大的FireFox
  10. SpringMVC源码总结(八)类型转换PropertyEditor的背后