您的位置:首页 > 编程语言 > Go语言

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的:

>>> 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自动工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Django 1.5文档