环境:windows 8.1+django1.6.6+python2.7.8+MySQL5.5.20+Pycharm4.0
MTV和MVC模式:
Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:
层次 | 职责 |
模型(Model),即数据存取层 | 处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。 |
模板(Template),即表现层 |
处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
|
视图(View),即业务逻辑层 | 存取模型及调取恰当模板的相关逻辑。模型与模板之间的桥梁。 |
从以上表述可以看出Django 视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django 模板 仅仅决定如何展现Django视图指定的数据。或者说, Django将MVC中的视图进一步分解为 Django视图 和 Django模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。
至于MVC控制器部分,由Django框架的URLconf来实现。URLconf机制是使用正则表达式匹配URL,然后调用合适的Python函数。URLconf对于URL的规则没有任何限制,你完全可以设计成任意的URL风格,不管是传统的,RESTful的,或者是另类的。框架把控制层给封装了,无非与数据交互这层都是数据库表的读,写,删除,更新的操作.在写程序的时候,只要调用相应的方法就行了,感觉很方便。程序员把控制层东西交给Django自动完成了。 只需要编写非常少的代码完成很多的事情.所以。它比MVC框架考虑的问题要深一步.因为我们程序员大都写程序在控制层。现在这个工作交给了框架,仅需写很少的调用代码,大大提高了工作效率。
以上引自百度百科
个人总结一下:
以上引自百度百科
个人总结一下:
- MVC模式:Model View Controller 模型 视图 控制器
- MTV模式:Model Template View 模型 模板 视图
- Django基于MVC,实际上为MTV。
- 将用户输入交于URLconf(urls.py)处理
- 把数据库操作封装成方法,在视图文件(views.py)中调用,
- Django的安装:
linux下,需要先安装pip,切需要使用root执行下列操作,否则会出错。windows去 www.djangoproject.org 下载安装。
>>pip install django ==1.7.
- Django安装好后,查看Django版本.
>>import django >>django.VERSION
- 新建django项目。在当前路径下创建名为project_name的项目
django-admin.py startproject [project_name] #例如 django-admin.py startproject mysite
- 初始项目目录下有一个与 项目名称同名 的子目录以及 manage.py文件,此为django自带的开发服务器。
在子目录下,有四个.py文件。 - 配置settings.py文件,修改语言,时区和加入app。
LANGUAGE_CODE="zh-cn"
TIME_ZONE=“Asia/Shanghai”
INSTALLED_APPS末尾加入'blog',为后面创建app做准备 - 创建app。在manage.py同级目录下。
django-admin.py startapp [app_name] #例如 django-admin.py startapp blog
- 修改mysite目录下urls.py,将访问的url映射到视图文件中.
#!-*-coding:utf8-*- from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('blog.views', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), #url(r'^admin/', include(admin.site.urls)), #以下显示了三种url向视图方法传参的方法。而patterns第一个参数则提取了公共的视图前缀。 #url(r'^blog/index/$','index',{'id':22}),#额外参数 url(r'^blog/index/(?P<id>\d{3})/$','index'),#关键字参数,利用正则 #url(r'^blog/index/index2/(\d{4})/$','index'),#位置参数 )
- 在相应的app的views.py文件内添加视图方法。方法名需保持和urls.py中映射的视图方法名一致(index).
视图方法连接了用户访问的url和模板文件(html).
三种方法:
一:
创建模板对象;创建数据对象;渲染模板
二:from django.template import Context,Template t = Template("<h1>{{ name }}</h1>") c = Context({"name":"Jack"}) print t.render(c)
创建使用templates目录下的html文件,在html中加入变量{{name}}。使用render_to_responsefrom django.shortcuts import render_to_response def index(request): retrun render_to_response("index.html",({"name":"Jack"})) 三: 使用render。把二中的render_to_response简化成了render。其他不变。但在pycharm4.0中发现使用render不行,所哟继续使用render_to_response import django.shortcuts import render
- 创建模板目录和html文件。
在相应的app下创建templates目录,然后创建html文件,文件名需要和视图方法中一致(index.html)
{{ name }},双层大括号代表变量,变量名需与视图方法中参数的key一致(name)
<!DOCTYPE html> <html> <head> <title>Mysite</title> </head> <body> <h1>{{ name }} </h1> </body> </html>
- 通过urls.py中映射的url访问。
http://127.0.0.1:8000/blog/index/222
- 视图方法中,渲染的字典数据值可以为对象,列表,或者新建类的实例
from django.shortcuts import render_to_response class Person(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def say(self): return "My name is %s" % self.name def index(request): booklist = ["Python","Django","Ruby","Perl"] user = Person("Jack",18,"female") return render_to_response("index.html",({'title':'MyBlog','booklist':booklist,'user':user,'id':1}))
然后在相应的模板文件(index.html)中通过调用属性方法的形式使用
<!DOCTYPE HTML> <html> <head> <title>{{ title }}</title> </head> <body> <div> <ul> <li>{{ booklist[0] }}</li> <li>{{ booklist[1] }}</li> <li>{{ booklist[2] }}</li> </ul> </div> <div> <p>{{ user.name }}</p> <p>{{ user.say }}</p> </div> <h1>{{ id }}</h1> </body> </html>
- urls.py文件中url映射视图的四种方式
(1)写出完整的视图方法地址字符串
urlpatterns = pattern('', url(r'^blog/index/$','blog.views.index'), )
(2)导入视图函数from blog.views import index urlpatterns = pattern('', url(r'^blog/index/$','index'), )
(3)导入模块名
from blog import views urlpatterns = pattern('', url(r'^blog/index/$','views.index'), )
(4)提取公共前缀urlpatterns = pattern('blog.views', url(r'^blog/index/$','index'), url(r'^blog/index2/$','index2'), )
- 追加url配置,一般直接在pattern方法的最后处添加。现在可以以urlpattern+ =pattern()的方式添加。可以使各个app视图模块更加清晰。
urlpatterns = pattern('blog.views', url(r'^blog/index/$','index'), url(r'^blog/index2/$','index2'), ) urlpatterns+ =pattern('blog2.views', url(r'blog2/index/$','index'), )