Django1.5:(二)创建第一个Django应用1
2013-08-03 14:06
387 查看
DjangoFocus(一)概要介绍了与Django密切相关的Python语法,由于Django 1.5初步支持Python 3,这里以这两个版本组合来演示。Poll app是Django 1.5.1官方文档中的示例,但其使用的Python版本是2.6和2.7,我将尽力尝试使其良好支持Python 3.3,当然Poll应用的介绍主题是对官方文档中相应部分的翻译,但并不是完全直译,其中添加了不少更详细地说明。使用windows
7操作系统。
通过实践来学习编程是必要的,这里以基础的投票应用(Poll app)为例,其包括两个部分:
一个供人们查看和投票的公共站点;
允许管理员添加、修改和删除投票的站点;
这里不介绍Django的安装了,网上有许多教程。如果你安装了,在shell中输入一下代码,你可以看到Django版本是1.5.1的:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
其中,● 最外层的mysite/目录仅仅是project的容器,其名称无关紧要,可以任意修改。● manage.py是用命令行与Django project交互的方式。● 里层的mysite/目录才是project的python包,在导入需要用到,如 import mysite.settings。●
mysite/__init__.py,不需要修改的空文件,告诉Python这是一个package。● mysite/settings.py项目的设置或配置文件。● mysite/urls.py项目的URL声明。● mysite/wsgi.py WSGI兼容的web服务器入口。
开发服务器:cd到外层mysite目录,命令python manage.py runserver。这可以启动一个用Python写的开发服务器,这样可以省去配置Apache之类正式的服务器配置。其结果如下:
在浏览器中访问http://127.0.0.1:8000/就可以看到淡蓝色的It works页面。如果出现错误,例如80端口被占用,你可以查看被占用的程序(netstat -ano),也可以修改开发服务器的默认端口。只需要在启动时添加以下就可以,例如使用8888端口,只需要这样:python manage.py runserver 8888。如果需要修改服务器IP地址为0.0.0.0,修改为0.0.0.0:8888即可。
启动数据库:
mysite/settings.py是Python模块级别的Django设置模块,在DATABASES中设置ENGINE,NAME,USER,PASSWORD,HOST。数据库可以使用PostgreSQL,MySQL等等。SQLite数据库是Python内置的数据库,可以减省大部分配置,只需要设置ENGINE为‘django.db.backends.sqlite3’,以及在NAME中给出存储数据库的绝对路径,如C:\homes\user\mysite\sqlite3.db。这里使用SQLite3。
在settings.py中设置一下时区,采用北京时间,TIME_ZONE = 'Asia/Beijing'。
在INSTALLED_APPS中可以查看project中安装的apps,同一个app可以用在多个项目中。在默认的django项目中,启动6个应用:
'django.contrib.auth' —认证系统
'django.contrib.contenttypes' —内容输入框架
'django.contrib.sessions' —session框架
'django.contrib.sites' —安装一个Django管理多个站点的框架
'django.contrib.messages' —消息框架
'django.contrib.staticfiles' —管理静态文件的框架
默认采用这些apps是为了便利,当然我们可以在这个列表中删去不想要的app(包括上面默认的),以及添加新app(如本例将要添加的polls)。每一个app至少需要用一个数据库表,需要为它们创建表,只需要执行命令:python manage.py syncdb,就可以看到表的创建过程,同时也可以看到在NAME中指定的路径处自动产生了一个sqlite3.db文件。创建完表之后,命令窗口询问是否建一个superuse,那就一次输入用户名(如admin)、邮箱和密码(如123)创建一个,后面还需要用到的。
polls/
__init__.py
models.py
tests.py
views.py
在Django中启用一个数据库的Web应用,首先要定义模型(M)。模型包括必要的fields和数据行为,遵循DRY(Don't Repeat Yourself)原则,便于重用。在这个投票应用中,需要创建两个模型,Poll和Choice,前者有一个问题和发布时间,后者有两个feilds:选择的内容和投票计数。每个Choice和一个Poll相联系。这些概念在实际使用中就是Python的类。编辑polls/models.py文件,使之看起来像这样子:
在settings.py文件中INSTALLED_APPS列表中添加'polls',,这样Django项目就可以包含polls应用,运行命令行 python manage.py sql polls创建数据库,可以看到命令窗口中显示创建了两个表"polls_poll"和"polls_choice",这是自动生成的名字,当然也可以重写。Primary keys(ID)也会自动产生,并且在外键field名称中自动添加"_id",外键关联用REFERENCES明确表明。sql命令并非真的是SQL语句,窗口中显示的是Django提供的一种易读提示。
再运行python manage.py syncdb,在数据库中为模型创建表。这个指令会为INSTALLED_APPS中还没有表的应用创建,所以每次添加一个app都需要运行该指令。这个指令可以在任意时候运行,它不会重新创建。
本部分结束了。下一部分介绍如何让admin自动工作。
7操作系统。
通过实践来学习编程是必要的,这里以基础的投票应用(Poll app)为例,其包括两个部分:
一个供人们查看和投票的公共站点;
允许管理员添加、修改和删除投票的站点;
这里不介绍Django的安装了,网上有许多教程。如果你安装了,在shell中输入一下代码,你可以看到Django版本是1.5.1的:
>>> import django >>> django.get_version() '1.5.1'
1.1 创建一个project
在cmd中cd到希望存放代码的文件夹,用下列命令来创建一个mysite文件目录,注意不用使用Python或Django中保留的目录名。另外,Django推荐把代码放在web服务器文件根目录(不是像php一样置于www下)之外的目录中,例如/home/mycode,这样可以避免别人通过web看到网站源代码的风险。django-admin.py startproject mysite这个命令会产生以下文件:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
其中,● 最外层的mysite/目录仅仅是project的容器,其名称无关紧要,可以任意修改。● manage.py是用命令行与Django project交互的方式。● 里层的mysite/目录才是project的python包,在导入需要用到,如 import mysite.settings。●
mysite/__init__.py,不需要修改的空文件,告诉Python这是一个package。● mysite/settings.py项目的设置或配置文件。● mysite/urls.py项目的URL声明。● mysite/wsgi.py WSGI兼容的web服务器入口。
开发服务器:cd到外层mysite目录,命令python manage.py runserver。这可以启动一个用Python写的开发服务器,这样可以省去配置Apache之类正式的服务器配置。其结果如下:
在浏览器中访问http://127.0.0.1:8000/就可以看到淡蓝色的It works页面。如果出现错误,例如80端口被占用,你可以查看被占用的程序(netstat -ano),也可以修改开发服务器的默认端口。只需要在启动时添加以下就可以,例如使用8888端口,只需要这样:python manage.py runserver 8888。如果需要修改服务器IP地址为0.0.0.0,修改为0.0.0.0:8888即可。
启动数据库:
mysite/settings.py是Python模块级别的Django设置模块,在DATABASES中设置ENGINE,NAME,USER,PASSWORD,HOST。数据库可以使用PostgreSQL,MySQL等等。SQLite数据库是Python内置的数据库,可以减省大部分配置,只需要设置ENGINE为‘django.db.backends.sqlite3’,以及在NAME中给出存储数据库的绝对路径,如C:\homes\user\mysite\sqlite3.db。这里使用SQLite3。
在settings.py中设置一下时区,采用北京时间,TIME_ZONE = 'Asia/Beijing'。
在INSTALLED_APPS中可以查看project中安装的apps,同一个app可以用在多个项目中。在默认的django项目中,启动6个应用:
'django.contrib.auth' —认证系统
'django.contrib.contenttypes' —内容输入框架
'django.contrib.sessions' —session框架
'django.contrib.sites' —安装一个Django管理多个站点的框架
'django.contrib.messages' —消息框架
'django.contrib.staticfiles' —管理静态文件的框架
默认采用这些apps是为了便利,当然我们可以在这个列表中删去不想要的app(包括上面默认的),以及添加新app(如本例将要添加的polls)。每一个app至少需要用一个数据库表,需要为它们创建表,只需要执行命令:python manage.py syncdb,就可以看到表的创建过程,同时也可以看到在NAME中指定的路径处自动产生了一个sqlite3.db文件。创建完表之后,命令窗口询问是否建一个superuse,那就一次输入用户名(如admin)、邮箱和密码(如123)创建一个,后面还需要用到的。
1.2 创建 models
工作环境project创建后,需要做点什么了,让我们来建一个投票应用吧。一个project可以包括多个apps,一个app也可以供多个projects使用,app像一个插件,所以我们在外层的mysite中创建一个polls文件夹作为顶层的模块,而不是mysite项目的子模块。命令: python manage.py startapp polls。这产生四个文件polls/
__init__.py
models.py
tests.py
views.py
在Django中启用一个数据库的Web应用,首先要定义模型(M)。模型包括必要的fields和数据行为,遵循DRY(Don't Repeat Yourself)原则,便于重用。在这个投票应用中,需要创建两个模型,Poll和Choice,前者有一个问题和发布时间,后者有两个feilds:选择的内容和投票计数。每个Choice和一个Poll相联系。这些概念在实际使用中就是Python的类。编辑polls/models.py文件,使之看起来像这样子:
from django.db import models 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)每个模型都继承django.db.models.Model,每个模型都有几个代表数据库中字段(field)的类变量,每个field是Field类的实例,譬如CharField是字符串字段,DateTimeFeild是日期时间字段,这告诉Django每个数据库field存储什么类型的数据。在每个Field中第一个位置参数是可选的,用于提供便于理解的名字,如‘date published',如果不提供则默认使用“机器语言”,这里其他的Field都不能理解,所以没有额外指定。某些Field需要参数,例如CharField可以使用max_length,也可指定可选参数,例如设置投票的初始值default=0。ForeignKey说明每个Choice和Poll关联,django支持所以的外键关系,多对一、多对多和一对一。
1.3 激活 models
利用Django我们一是为app创建一个数据库架构,二是利用Python的数据库API获取Poll和Choice对象。在settings.py文件中INSTALLED_APPS列表中添加'polls',,这样Django项目就可以包含polls应用,运行命令行 python manage.py sql polls创建数据库,可以看到命令窗口中显示创建了两个表"polls_poll"和"polls_choice",这是自动生成的名字,当然也可以重写。Primary keys(ID)也会自动产生,并且在外键field名称中自动添加"_id",外键关联用REFERENCES明确表明。sql命令并非真的是SQL语句,窗口中显示的是Django提供的一种易读提示。
再运行python manage.py syncdb,在数据库中为模型创建表。这个指令会为INSTALLED_APPS中还没有表的应用创建,所以每次添加一个app都需要运行该指令。这个指令可以在任意时候运行,它不会重新创建。
1.4 用Django的API操作数据库
由于Django提供了数据库API,可以用Python shell与数据库交互。命令行python manage.py shell可以启用shell,这里不使用“python”,因为manage.py可以设置DJANGO_SETTINGS_MODULE环境变量,提供Python的导入路径给Django到mysite/setting.py文件。在python manage.py shell中可以探索database API了:>>> from polls.models import Poll, Choice # 导入poll model中的类 # 数据库中暂时还没有polls >>> Poll.objects.all() [] # 创建一个新的投票. # 支持时区,在settings中设置 >>> from django.utils import timezone >>> p = Poll(question="What’s new?", pub_date=timezone.now()) # 保存这个对象到数据库. >>> p.save() # 自动创建一个ID,从1开始 >>> p.id 1 # 通过Python属性获取数据库的列columns >>> 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() # objects.all()展示数据库中所有的polls >>> Poll.objects.all() [<Poll: Poll object>]<Poll: Poll object>是个莫名其妙的东西,需要修改使它更容易理解,在polls/models.py中添加
class Poll(models.Model): # ... def __unicode__(self): a2dc return self.question class Choice(models.Model): # ... def __unicode__(self): return self.choice_text但是在Python 3.3中用__unicode__是没有效果,需要改为__str__,因为Python 3默认unicode编码。在model中这些都是普通的Python方法,添加一个新的方法,来判断poll是不是最近发布:
import datetime from django.utils import timezone # ... class Poll(models.Model): # ... def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1)重新启动shell,继续试验:
>>> from polls.models import Poll, Choice # 确认__unicode__()工作,但在Python 3.3中没有工作 >>> Poll.objects.all() [<Poll: What’s up?>] # Django API提供丰富的关键字参数 >>> Poll.objects.filter(id=1) [<Poll: What’s up?>] >>> Poll.objects.filter(question__startswith=’What’) [<Poll: What’s up?>] >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Poll.objects.get(pub_date__year=current_year) <Poll: What’s up?> # 要求一个ID,不存在时会引发异常 >>> Poll.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Poll matching query does not exist. Lookup parameters were {’id’: 2} # primary key也常见,Django提供缩写pk供使用 >>> Poll.objects.get(pk=1) <Poll: What’s up?> # 确认was_published_recently方法工作 >>> p = Poll.objects.get(pk=1) >>> p.was_published_recently() True # 给Poll一些选项 >>> p = Poll.objects.get(pk=1) # 展示Poll中的choice,暂时还没有 >>> p.choice_set.all() [] # 创建3个choices,调用create函数 >>> p.choice_set.create(choice_text=’Not much’, votes=0) <Choice: Not much> >>> p.choice_set.create(choice_text=’The sky’, votes=0) <Choice: The sky> >>> c = p.choice_set.create(choice_text=’Just hacking again’, votes=0) # API借口可以展示相关的Poll对象 >>> c.poll <Poll: What’s up?> # 反之亦然,Poll可以展示choice >>> p.choice_set.all() [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] >>> p.choice_set.count() 3 >>> Choice.objects.filter(poll__pub_date__year=current_year) [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] # delete()删除choice >>> c = p.choice_set.filter(choice_text__startswith=’Just hacking’) >>> c.delete()更详细的使用方法在Django 1.5.1的官方文档相关部分有,原文给出相关链接。
本部分结束了。下一部分介绍如何让admin自动工作。
相关文章推荐
- Django1.5:(二)创建第一个Django应用3
- Django1.5:(二)创建第一个Django应用2
- Ubuntu12.04系统下写你的第一个Django1.5应用(四)--form
- Ubuntu12.04系统下写你的第一个Django1.5应用(一)--环境搭建--数据库,时区,语言,配置
- django实例:创建你的第一个应用投票系统(3)(4)
- django实例:用创建你的第一个应用投票系统
- Django创建第一个应用
- Django来敲门~第一部分【4. 创建第一个模块应用】
- Ubuntu12.04系统下写你的第一个Django1.5应用(三)--view
- windows7安装django并创建第一个应用
- django实例:创建你的第一个应用投票系统(3)后台管理
- Ubuntu12.04系统下写你的第一个Django1.5应用(二)--admin
- 如何快速创建你的第一个django应用
- django实例:用创建你的第一个应用投票系统
- windows7安装django并创建第一个应用
- django实例:创建你的第一个应用投票系统(2)数据库的安装
- 第二章:2.2 开始第一个 web Django 项目的创建和应用
- Windows 安装Django并创建第一个应用
- (转)Django ====> 实战学习篇二 需求分析及设计,创建第一个模型---购物车的应用
- 四、创建第一个Django页面应用