摘要:改写视图函数上一章我们感受了视图的工作流程。循坏表示依次取出中的元素,命名为,并分别执行接下来操作。即为语言,中间包裹了一个段落的文字。有疑问请在杜赛的个人网站留言,我会尽快回复。
改写视图函数
上一章我们感受了视图的工作流程。
为了让视图真正发挥作用,改写article/views.py中的article_list视图函数:
article/views.py from django.shortcuts import render # 导入数据模型ArticlePost from .models import ArticlePost def 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 %}{{ article.title }}
{% endfor %}
作为一个Web框架,Django通过模板来动态生成HTML,其中就包含描述动态内容的一些特殊语法:
{% for article in articles %}:articles为视图函数的context传递过来的对象,即所有文章的集合。{% for %}循坏表示依次取出articles中的元素,命名为article,并分别执行接下来操作。末尾用{% endfor %}告诉Django循环结束的位置。
使用.符号来访问变量的属性。这里的article为模型中的某一条文章;我们在前面的ArticlePost中定义了文章的标题叫title,因此这里可以用article.title来访问文章的标题。
...
即为html语言,中间包裹了一个段落的文字。在上一章中已经定义好了urls.py,因此不再需要改动。
一切都很好,深吸一口气。保存所有文件,在浏览器中输入地址http://127.0.0.1:8000/article/article-list/,得到以下错误:
似乎成功从来都不会很顺利。
错误分析虽然出错了,但幸运的是Django提供了非常完善的错误处理系统,方便开发者快速找到Bug的蛛丝马迹。
第一行就醒目地提示:TemplateDoesNotExist,说明Django没有找到list.html这个文件。仔细检查目录、文件的名称无误,没问题就往下继续看。
然后发现有这么两行:
...djangocontribadmin emplatesarticlelist.html (Source does not exist) ...djangocontribauth emplatesarticlelist.html (Source does not exist)
似乎Django在这两个位置搜索,没有发现需要的文件,然后返回了“未发现模板文件”的错误。
定位了问题的所在,接下来就是在哪里“告诉”Django我的模板的位置呢?
答案就在settings.py中了,它保存了Django项目的各种初始配置。
打开并找到这一段,加入代码os.path.join(BASE_DIR, "templates"):
my_blog/settings.py TEMPLATES = [ { ... # 定义模板位置 "DIRS": [os.path.join(BASE_DIR, "templates")], ... }, ]
这就是说模板文件在项目根目录的templates文件夹中,去找找吧。
很好,保存文件,重新启动服务器,刷新浏览器,如下:
成功!
虽然简陋,但是已经完全走通了MTV(model、template、view)整个环路。
不要激动,精彩的还在后面。
总结本章我们重写了视图,编写了简单的模板,和前面的模型成功关联起来。
下一章将学习编写一个漂亮的网页模板。
有疑问请在杜赛的个人网站留言,我会尽快回复。
或Email私信我:dusaiphoto@foxmail.com
项目完整代码:Django_blog_tutorial
转载请告知作者并注明出处。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42460.html
摘要:有编程基础的同学都知道,类是面向对象技术中非常重要的概念。有区别的是,是作为功能添加到子类中的,而不是作为父类。首先调用父类方法,将这个对象赋值给变量,然后再对其进行统计浏览量的操作,最后将对象返回。 说是完结,马上又开始写进阶篇了。 本章不会为博客项目增加新功能,但是也同样重要,因为我们要学习高逼格的基于类的视图。 什么是类视图 前面章节中写的所有视图都是基于函数的,即def;而类视...
摘要:有了文章列表页面后,当然还需要详情页面,方便用户对某一篇感兴趣的文章深入阅读。编写视图函数打开,增加文章详情页面的视图函数文章详情取出相应的文章需要传递给模板的对象载入模板,并返回对象函数中多了这个参数。 有了文章列表页面后,当然还需要详情页面,方便用户对某一篇感兴趣的文章深入阅读。 编写视图函数 打开article/views.py,增加文章详情页面的视图函数article_deta...
摘要:随着时间的推移加上勤奋的写作,你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。这个时候就需要对文章进行分页的处理。有疑问请在杜赛的个人网站留言,我会尽快回复。 随着时间的推移(加上勤奋的写作!),你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。 这个时...
摘要:比如,在一个博客应用中,你可能会创建如下几个视图博客首页展示最近的几项内容。这些需求都靠视图来完成。首先写一个最简单的视图函数,在浏览器中打印出字符串。调用函数时会返回一个含字符串的对象。换句话说,的作用是将映射到视图中。 Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」。比如,在一个博客应用中,你可能会创建如下几个视图: 博客首页:展示最近的几项内容。 内容详情...
摘要:下一步就是修改视图。判断语句的条件有两个博文的标题图不是必须的,剔除掉没有标题图的文章,这些文章不需要处理图片。总结本章学习了如何上传并处理文章的标题图,从此博客首页就有了漂亮的外观。 现在虽然博客的功能大都实现了,但是界面还是比较朴素,特别是首页的文章列表几乎全是文字,看多了难免疲劳。因此,给每个文章标题配一张标题图,不仅美观,用户也能通过图片快速了解文章内容。实际上大部分社交网站也...
阅读 3534·2021-11-23 09:51
阅读 2760·2021-11-23 09:51
阅读 627·2021-10-11 10:59
阅读 1634·2021-09-08 10:43
阅读 3193·2021-09-08 09:36
阅读 3260·2021-09-03 10:30
阅读 3258·2021-08-21 14:08
阅读 2155·2021-08-05 09:59