Django开发博客- 三部曲
其实在django中实现一个功能只需要三个步骤即可,这里我姑且叫它三部曲。
这三部曲就是:
- 定义urls映射
- 定义views
- 定义templates
什么是URL?
URL就算一个WEB地址,你在浏览器输入这个地址,然后浏览器返回相应的网页给你。 比如http://djangogirls.com是一个URL,而127.0.0.1:8000同样也是个URL,默认就是http协议的。
Django中的URL工作原理
我们打开mysite/urls.py文件,会发现类似下面这样:
1 |
from django.conf.urls import patterns, include, url from django.contrib import admin |
上面的两行注释先不要管,这个以后再用到。 django默认已经为我们添加了admin的URL配置。 当django碰到以admin/开头的URL的时候会去admin.site.urls里面去寻找对应的匹配。 所有和admin相关的urls配置都写在一个文件中,这样就便于管理了。
正则表达式
你可以看到上面的url用到了正则表达式,比如’^admin/’、’^$’等等, django是通过正则式来匹配URL的。关于正则式这里不想展开太多。可以参考相关数据和教程。
第一个django url配置
现在我们要将http://127.0.0.1:8000/这个首页地址映射到一个显示最新文章列表的页面上面去。一般的博客首页基本都是这样的。
为了保持mysite/urls.py配置文件的简介,我们最好将博客的url配置放到单独的文件中。在mysite/urls.py中去将它引进来即可。
那么你的mysite/urls.py文件现在类似于这样了:
1 |
from django.conf.urls import patterns, include, url from django.contrib import admin |
blog.urls
创建文件blog/urls.py,然后加入下列内容
1 |
from django.conf.urls import patterns, include, url |
现在我们将r’^$’的url映射到视图views.post_list。
不过你要是现在就访问首页http://127.0.0.1:8000/的话会报错的。

为啥,因为你的视图views.post_list现在没有实现啊,找不到这个方法!
那么接下来我们就来讲解view的实现了。
什么是view?
view也叫视图,在django中它存放了实际的业务逻辑。这个跟我们通常所说的MVC中的view是不一样的。
django的MTV模式
这里我稍微解释下django的结构,一般我们称之为MTV模式:
- M 代表模型(Model),即数据存取层。该层处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行为以及数据之间的关系等。
- T 代表模板(Template),即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。
- V 代表视图(View),即业务逻辑层。该层包含存取模型及调取恰当模板的相关逻辑。你可以把它看作模型与模板之间的桥梁。
那么通常意义的控制器Controller去哪里了呢,细心的童鞋应该会猜到了,那就是我们上一节所讲的urls.py配置文件。
一句话总结:URLconf+MTV构成了django的总体架构。
blog/views.py
这个文件初始内容是这样的:
1 |
from django.shortcuts import render # Create your views here. |
添加一个最简单的视图:
1 |
def post_list(request):
return render(request, 'blog/post_list.html', {})
|
我们定义了一个方法post_list,它的参数是request,使用render函数返回一个html模板blog/post_list.html。
接下来我们访问下首页,OMG,又出错了:

这次报的错是模板blog/post_list.html找不到。这个是显而易见的,因为我们根本还没有定义这个html模板。
别着急,继续沿着教程往下看就行…
什么是模板?
一个模板就是一个使用固定格式呈现动态内容的可重用的文件。 比如你可以使用一个模板来写邮件,每封邮件可能有不同的内容,寄给不同的人,但是它们的格式是一样的。
Django中的模板使用HTML文件,至于神马是HTML,这个去参考下W3C或者自行google下, 不过如果做web开发的人不懂HTML,请不要告诉别人我认识你。^_^
第一个模板
创建一个模板就是创建一个HTML文件。模板文件存储在blog/templates/blog目录下面, 首先在blog目录下创建templates目录,然后再在templates目录下创建blog目录,至于为啥要这么做, 先不用管,django里面很多目录都是约定好的,这个就跟maven是一样的,约定高于配置。 所以你先照着做就是了。目录结构如下:
blog |
然后在blog/templates/blog目录下创建一个post_list.html文件,现在里面还没有内容。
这时候再次访问首页,效果如下:

一片空白,但没有报错了。
在post_list.html中添加点东西:
1 |
<html> |
再次访问http://192.168.203.95:8000/:

动态模板
不过目前为止我们还只能显示静态的网页。怎样将文章列表在首页显示出来呢?
我们已经有了模型Post,有了模板post_list.html,怎样使得模型数据在模板中显示出来呢, 这个就是视图的功能了,实际上,django中的视图的作用就是连接模型和模板的桥梁。 在视图中,通过QuerySet将数据库中的数据检索出来,然后传递给模板,模板负责显示出来。
首先打开blog/views.py,它目前的内容是这样的:
1 |
from django.shortcuts import render def post_list(request): |
这时候我们将Post模型导入进来
1 |
from django.shortcuts import render |
注意我们还是用到了相对导入,这是python3的强大功能。
QuerySet
是时候请出QuerySet了,在模型和ORM小节我们已经介绍过。
现在我们想要将数据库中的文章都检索出来并且按照发布日期逆序排序,使得最新的文章放前面。
1 |
from django.shortcuts import render |
注意render函数中最后一个参数{‘posts’: posts},这个就是用来给模板传递数据的。
模板标签
HTML页面只识别HTML标签,那么怎样让生成动态的内容呢?答案就是使用django自带的模板标签, 包括了判断、循环、管道等语法。我们已经获取了文章的列表了,那么可以使用for循环来生成相应的HTML页面:
1 |
<html> |
在{% for %} 和{% endfor %}之间会循环每个post,然后每次生成一段
现在再次访问首页,效果如下:

别忘了一件事
别忘了把它push到pythonanywhere上面去。
git add . |
恭喜你,目前为止基本的全程已经贯通了。打开admin后添加几篇文章, 记得填上发布日期,再刷新下首页,看会不会显示出来。
好了,这时候你可以出门左拐去小卖部给自己买点棒棒糖奖励下自己了!
Django开发博客- 三部曲的更多相关文章
- django开发博客(1) 入门
现在正式开始博客开发 1.安装django1.4 如果你使用的是fedoraDVD版,安装时选择了web开发组建,这一步可以省略,因为它自带django环境 django下载地址 https://ww ...
- 纯django开发博客系统
企业级教程:纯django开发博客系统 1.视频教程 https://www.duanshuilu.com/ 2.教程文档 https://www.duanshuilu.com/ 0.课程简介1.简价 ...
- 使用django开发博客过程记录4——Category分类视图
在写点击博客的所属分类,显示所有该分类的文章时真是让我想了好一会,为什么呢?因为我使用的是cbv模式开发的而不是简单的视图处理逻辑的,所以,有些操作会被包装好了,你并不知道它的细节,那么我们今天要实现 ...
- 使用django开发博客过程记录3——博客侧栏实现
说起这个侧栏真是苦恼我很长时间,一开始以为和之前的一样传递额外参数就可以了就像下面这样: class IndexView(ListView): template_name = 'apps/index. ...
- Django开发博客 入门篇
Django是神马? Django是一个开源免费的Web框架,使用Python编写.能够让你快速写出一个Web应用, 因为它包含了绝大部分的组件,比如认证,表单,ORM,Session,安全,文件上传 ...
- 使用django开发博客过程记录5——日期归档和视图重写
针对每条博客的观看次数我么是使用django的Mixin实现的: def get(self, request, *args, **kwargs): last_visit = request.sessi ...
- 使用django开发博客过程记录2——博客首页及博客详情的实现
1.什么是CBV(Class-based views) 2.博客首页及博客详情实现 1.什么是CBV 什么是CBV?说白了就是以前是视图为处理请求返回响应的函数,有了cbv之后我们就可以用类处理请求和 ...
- Django开发博客- 部署
安装Git Git是一个被大量程序员使用的”版本控制系统”.此软件可以跟踪任何时间文件的改变,这样你以后可以随时召回某个特定版本. windows系统下面可以下载git-scm安装.除了第5步”Adj ...
- Django开发博客- 模型
django的模型就是用于在数据库中存储的某种类型的对象.在我们的博客系统中, 发表的文章就是一个模型,需要存储在数据库中. 这里我们使用django默认的sqlite3库,对于我们的这个小系统而言已 ...
随机推荐
- UE4编程之C++创建一个FPS工程(二)角色网格、动画、HUD、子弹类
转自:http://blog.csdn.net/u011707076/article/details/44243103 紧接上回,本篇文章将和大家一同整理总结UE4关于角色网格.动画.子弹类和HUD的 ...
- Dev GridControl导出
问题一. DevExpress GridView导出到Excel中不能导出自定义日期 问题描述: 我有一个第一列为日期列的GridView.它在运行时会绑定到日期,但他们通过CustomColumnD ...
- 【转载】C++知识库内容精选 尽览所有核心技术点
原文:C++知识库内容精选 尽览所有核心技术点 C++知识库全新发布. 该知识库由C++领域专家.CSDN知名博客专家.资深程序员和项目经理安晓辉(@foruok)绘制C++知识图谱,@wangshu ...
- FreeSWITCH的TLS加密
听着很高大上(实际也很实用)的加密机制,在FreeSWITCH里配置支持竟然这么简单! Greate FreeSWITCH and Greate Programmer! ① cd /usr/local ...
- Create Function
示例,创建一个名为HelloWorld4的函数,不需要输入参数 CREATE FUNCTION HelloWorld4()RETURNS VARCHAR(20)ASBEGINRETURN 'Hello ...
- mysql密码忘记或者不知道,怎么办?
运行cmd: 输入mysql回车,如果成功,将出现MySQL提示符 > 连接权限数据库>use mysql; (>是本来就有的提示符,别忘了最后的分号) 修改改密码:> upd ...
- 概念学习(Concept Learning)
从特殊的训练样例中归纳出一般函数是机器学习的核心问题.一般函数是对理想目标函数的函数逼近(function approximation).简而言之,从特殊到普通.与此对应的是演绎推理(deductiv ...
- VirtualBox全屏切换
用VirtualBox的时候,如果设置为全屏,想再切换回来,没有什么菜单,只有通过键盘的快捷键来操作,才可以恢复. 我常常忘掉,所以老是得去找,以后需要记住这几个按键的快捷键. 1.全屏与非全屏切换: ...
- EntityManager方法简介
EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满足条件的实体Bean.实体B ...
- [转载] 一些非常好的 linux 基础工具
http://linuxtools-rst.readthedocs.org/zh_CN/latest/index.html 作者整理的非常好, 需要的时候可以拿来参考