我是边看Django相关文档边整理的这篇博客,至关于学习笔记,写的有点乱,若是你已经了解Django开发,就不用看了,不过这里仍是涉及到了一点Django的设计思路,对理解Django仍是有些好处的,文后有Django中英文档连接。html
本质上来讲, Django 只不过是用 Python 编写的一组类库。 用 Django 开发站点就是使用这些类库编写 Python 代码。 所以,学习 Django 的关键就是学习如何进行 Python 编程并理解 Django 类库的运做方式。 ##环境准备## Django的安装请直接官方文档Django 安装章节 很容易懂,很少说了,若是搞不定推荐看看这篇博客python
执行命令建立Django项目的骨架web
django-admin.py startproject mysit
建立的Django项目目录结构以下正则表达式
mysite/ __init__.py manage.py settings.py urls.py
启动服务sql
python manage.py runserver
控制台打印以下信息:shell
Validating models... 0 errors found March 18, 2014 - 10:42:35 Django version 1.6.2, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
此时已经启动web服务,默认端口号为8000数据库
浏览器访问 http://127.0.0.1:8000/ 展现出Django的欢迎 界面,就是这么简单django
代码编写,建议您使用python自带的IDLE编辑器编程
编写视图(你会注意到Django的视图概念相似咱们常说的MVC里的控制器C,概念稍有不一样,后面会解释)浏览器
新建views.py,代码入下
from django.http import HttpResponse def hello(request): return HttpResponse('Hello world')
绑定视图
编辑urls.py(这个文件是框架生成的,在mysite目录下,为url映射文件)新增一行代码url('^hello/$', hello),
后以下
from django.conf.urls import patterns, include, url from django.contrib import admin from mysite.views import hello admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), # 这一行为新增,将url xxx/hello/ 映射到方法视图的函数 hello url('^hello/$', hello), )
浏览器访问 http://127.0.0.1:8000/hello 会展现你的Hello World
编写视图 修改views.py,代码以下
from django.http import HttpResponse import datetime def hello(request): return HttpResponse('Hello world') def datetime_now(request): now=datetime.datetime.now() html="<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
修改视图
修改urls.py 相似上面新增一行映射代码 url(r'^nowtime/$', datetime_now),
浏览器访问 http://127.0.0.1:8000/nowtime 会展现当前时间在网页上
经过两个例子,已经能够看到,视图的函数老是接收一个request参数而且返回一个HttpResponse
在这个例子中,看一下动态ur的处理,好比下面这种,你总不能每一个都url都静态绑定进去,这里要用到正则表达式
,咱们在例子中展现几个小时候的时间,给一个两位整数的小时偏移量
book/1
book/2
book/222
编辑视图
修改views.py,代码以下
from django.http import HttpResponse , Http404 import datetime #...省略部分代码... def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() + datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html)
绑定视图
修改urls.py,继续增长一行映射代码url(r'^nowtime/plus/(\d{1,2})/$', hours_ahead),
注意用圆括号把 \d{1,2} 包围起来:
浏览器访问
http://127.0.0.1:8000/nowtime/plus/2
http://127.0.0.1:8000/nowtime/plus/22
http://127.0.0.1:8000/nowtime/plus/7
如上例子中的,html代码是写在python代码中的,下面介绍Django的模板技术,解决这种紧耦合,解耦网页设计和python代码,下面使用模板技术重写第二个例子
写模板
在mysite下新建文件夹templates用于存放全部模板,新建datetime_now.html
,内容以下
<html><body>It is now {{ datetime_now }}.</body></html>
修改视图
from django.http import HttpResponse , Http404 from django.template import Template , Context from django.template.loader import get_template import datetime #...省略部分代码... def datetime_now(request): now=datetime.datetime.now() #使用loader加载模板,建立Template对象 t=get_template('datetime_now.html') #建立Context对象,调用render()方法 html=t.render(Context({'datetime_now':now})) return HttpResponse(html)
另外还须要配置模板的路径,修改settings.py 增长以下,其中BASE_DIR是已有代码
#这行会是已经有的代码 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #下面的为新增代码 TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'templates').replace('\\','/'), )
一样,浏览器访问 http://127.0.0.1:8000/nowtime 会展现当前时间在网页上
##数据模型层##
首先,Django对数据模型层的支持真心不错,下面例子选择内置的sqlite3做为数据库,由于简单
数据库的配置在settings.py里,sqlite的配置最简单,以下
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
由于Django默认约束若是使用到数据库(模型层)必需要建立app,实际上也是这样,通常一个 project包含多个app
下面建立一个app,名字为polls
python manage.py startapp polls
建立后的目录结构以下
polls/ __init__.py models.py tests.py views.py
编辑models.py 定义模型
from django.db import models from django.utils import timezone import datetime # Create your models here. class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): poll = models.ForeignKey(Poll) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
你能够看出,上面定义了Poll 和 Choice两个实体,一对多关系,每一个字段的名字,长度,类型 都是和数据库表对应起来的
编辑 settings.py 文件,激活你的app
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls', )
检查模型有效性
python manage.py validate
查看数据库语句
python manage.py sqlall polls
你将会看到生成的建表语句,表名字段名等生成规则是能够自定义的
上面只是浏览,下面这条语句会真正执行建立表的动做
python manage.py syncdb
如你所见,表已经建立好了
启动shell
python manage.py shell
下面,执行下面的语句熟悉下django提供的数据操做API吧
>>> from polls.models import Poll, Choice # 引入类 # 返回空的列表,由于尚未插入数据 >>> Poll.objects.all() [] #建立一个Poll,使用django的timezone模块 >>> from django.utils import timezone >>> p = Poll(question="What's new?", pub_date=timezone.now()) # 保存到数据库 >>> p.save() #id是自动生成的 >>> p.id 1 # 经过属性访问数据库字段 >>> p.question "What's new?" >>> p.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # 改变属性并保存 >>> p.question = "What's up?" >>> p.save() # 显示数据库的全部Poll,这里由于没有写__str__()方法(python2.x是__unicode())因此显示成这样,相似于Java的toString >>> Poll.objects.all() [<Poll: Poll object>]
###至此就差很少了,我去继续熟悉python和django的API了###
Django 的设计遵循MVC
Django中 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 表明模型(Model),即数据存取层。与传统 MVC 的 M 概念一致
T 表明模板(Template),即表现层。至关于 MVC 中的 V, 类比JSP,Velocity和Freemarker
V 表明视图(View),即业务逻辑层。至关于 MVC 中的 C,类比Spring的Controller或Struts的Action
MVC仍是MTV,只是概念问题
Django官方文档英文还能够的话固然建议看这个
Django中文手册(比较旧)