`
yangjizhong24
  • 浏览: 395730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

windows下创建你的第一个Django应用

阅读更多

    本来哥们一直用PYTHON作为脚本工具来快速开发的,方便与否就不多修饰了,简直就是NB嘛,不过..这几天遇到个问题,就是要把一些内容“展示”出来给非编程人员看,这就让我有点郁闷了,的确总不能让人家登陆服务器然后运行脚本看结果吧,于是乎打算玩玩django,它的作用这里不多说了,本文内容主要是如何建立一个Django应用。

 

    PS:此篇仅是个开始,估计下一篇应该是如何在apache下运行django吧,具体我现在还不清楚呢,等哥们调研完了再写哈,或者大家有好文章推荐给我最好了。。一起学习一起分享

 

本文主要参考了IBM的基于 Django 框架的敏捷 Web 开发一文:http://www.ibm.com/developerworks/cn/opensource/os-cn-django/index.html、和官方文档:http://docs.djangoproject.com/en/dev/intro/tutorial01/

 

我的python:2.5版本的,django目前最新:1.2.4,环境:windows,db:mysql

 

 

好啦开始说了:

 

一.首先从官方网站下载Django包

 

     解压后进入Django目录,在命令行里执行python setup.py install,这样Django就会作为第三方模块被安装在Python的site-packages目录中,然后把Django中bin目录的路径添加到环境变量path里面,这样在命令行里就可以方便的使用Django提供的各种指令。本应用实例将创建实现一个新闻公告牌,用户可以从后台添加新闻分类和条目,然后在前端页面中显示新闻的统计信息。

 

 

二。新建你的APP

 

打开命令提示符,进入到想要创建应用的目录,键入django-admin.py startproject news命令,调用Django的控制台命令新建一个名为news的工程,与此同时Django还在新创建的news文件夹下生成以下四个分工不同的文件。

  • __init__.py
    文件__init__.py可以向Python编译器表明当前文件夹下的内容是Python工程模块。
  • 2.manage.py
    manage.py是Python脚本文件,与Django的命令行工具django-admin.py配合,可以对建立的工程进行管理配置。
  • settings.py
    这是Django工程的配置文件,与工程相关的工程模块和数据库全局配置信息都在settings.py中设置。
  • urls.py
    文件urls.py负责配置URL的地址映射以及管理URL的地址格式。

三。看看效果

 

键入命令manage.py runserver,就可以启动Web服务器来测试新建立的工程,如果启动没有错误,将可以看到下面这样的提示信息:“Development server is running at http://127.0.0.1:8000/” 表示当前工程已经可以通过本机的8000端口访问。在命令行里使用Ctrl+Break或Ctrl+C的组合键可以停止runserver命令启动的Web服务器。当然,Django自带的Web服务器一般只是在开发测试的过程中使用,真正部署使用的时候要用到APACHE了,这里不讲解哈,稍等。。。不同的端口下运行命令:python manage.py runserver 8080

 

 

四。编写Django的应用

 

接下来就可以编写Django的应用模块。键入命令python manage.py startapp article,命令会在当前工程下生成一个名为article的模块,目录下除了标识Python模块的__init__.py文件,还有额外的两个文件models.py和views.py。

在当前的工程中,需要有两个Models模型,分别对应List表和Item表,用来存储新闻的分类和新闻的条目,每个Item项都会有一个外键来标记文章的归属分类。下面打开Django创建的models.py文件,按照文件注释中提示的模块添加位置,编写如下的代码:

 

from django.db import models
import datetime 

class List(models.Model): 
	title = models.CharField(max_length=250, unique=True) 
	def __str__(self): 
		return self.title 
	class Meta: 
		ordering = ['title'] 
	class Admin: 
		pass 
class Item(models.Model): 
	title = models.CharField(max_length=250) 
	created_date = models.DateTimeField(default=datetime.datetime.now) 
	completed = models.BooleanField(default=False) 
	article_list = models.ForeignKey(List) 
	def __str__(self): 
		return self.title 
	class Meta: 
		ordering = ['-created_date', 'title'] 
	class Admin: 
		pass 

 

 

这里需要说明一下:

 

上面这段Python代码定义了存储新闻分类的List数据表,上述模型中的定义会被Django转换成与数据库直接交互的结构化查询语言来建立数据表,即创建一个名为List的表格,表格内的两个字段分别是Django自动生成的整型主键id和最大宽度为250个字符的VARCHAR类型字段title,并且在title字段上定义了唯一性约束,来保证新闻分类不会有完全相同的名称。

在List类文件里还定义了函数__str__(),作用是返回self字符串表示的title字段。而在类Meta中,设置了List表格按照title字母顺序的排序方式。在类Admin的设置中,允许Django针对当前的Models模型自动生成Django超级用户的后台管理入口,关键词pass设定Django将按照默认方式生成后台管理界面。在记录排序的ordering设置中,符号“-”表示按照日期的倒序进行排列,如果文章创建日期相同,则再按照title的字母序正序排列。

到此为止,应用中模型部分需要定义的两个数据表都已经创建完毕,下一步的工作是让Django部署并在数据库中生成已经写好的Models模型。

 

 

五。django模块的部署

 

在Django中,与工程全局相关的设置都需要在配置文件settings.py中添加。笔者使用MySQL作为后台数据库,并且已经在MySQL中创建名为django_news的数据库。则需要在settings.py文件中的相应位置设定DATABASE_ENGINE = "mysql" 以及 DATABASE_NAME = "django_news"。

在使用MySQL数据库时,需要额外安装MySQL的Python链接库MySQLdb,这个模块可以在站点http://sourceforge.net/projects/mysql-python/下载,注意:一定下载的包与你的python版本和mysql版本相适合

接下来的DATABASE_USER和DATABASE_PASSWORD两项内容则需要用户根据本机设置填写访问数据库的用户名和密码。如果数据库安装在其他机器上或者更改了数据库的监听端口,则还需要设置DATABASE_HOST地址和DATABASE_PORT项:

 

DATABASE_USER = 'django' 
DATABASE_PASSWORD = 'django_password'

 

为了使Django识别开发者添加的应用模块,在settings.py文件的INSTALLED_APPS部分中,需要定义Django工程加载的应用列表。默认情况下,列表中已经添加了Django工程运行所需的部分自带模块,我们还需要把刚才编写好的应用模块news.article加入其中,同时添加Django自带的django.contrib.admin应用模块,修改好的代码如下所示:


INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'news.article'
)

添加admin模块后还不能立即使用Django的admin后台管理界面,需要打开News工程根目录下的urls.py文件,将“# Uncomment this for admin:”后面的#注释去掉,使得Django针对管理界面的URL转向“ (r'^admin/', include(admin.site.urls)),”可用,这样访问admin模块时Django就可以顺利解析访问地址并转向后台管理界面。

 

当配置文件的改动完成之后,就可以在News工程的命令提示符下执行manage.py syncdb指令。Django会根据模型的定义自动完成ORM的数据库映射工作,屏蔽了底层数据库细节和SQL查询的编写。(帮你把table,映射都建立完成)

 

展示Django魅力的时刻已经来临,Django框架将让开发者开始神奇的体验。随着命令执行后的滚动提示,Django已经根据我们刚才在models里定义的映射文件,自动在数据库里创建好对应的表和字段。命令执行的同时会提示用户创建“superuser"账户,来登陆Django自动创建好的后台管理界面对模型进行管理。

 

再次使用命令manage.py runserver来启动Django自带的Web服务器后,在浏览器中访问地址http://127.0.0.1:8000/admin/,使用刚才创建的superuser用户的账号和密码登陆,如图3所示漂亮的Django后台管理界面就出现在眼前。


 

 

注意:如果你此刻未看见article标签及items和lists,那么需要在news目录下建立admin.py文件,里面内容:

 

from article.models import List
from article.models import Item
from django.contrib import admin

admin.site.register(List)
admin.site.register(Item)

 

就哦了。

 

在admin管理界面中,显示了应用中已经定义的各个models模块,当点击查看时,则会显示models中存在的数据库对象列表。Django提供的后台管理界面方便用户直接更改或添加数据库字段,下面我们点击"Lists"项旁边的“Add”来添加新的新闻分类。在title字段中键入“Sports News”或其他你喜欢的分类后保存。然后在"Items"项中点击“Add”,填入新闻的第一个条目,每个Item条目都对应List中的一个分类项,添加Item的界面如图4所示,由于设置了表之间的关联,Django的Item管理界面中会为已添加List分类自动生成内容的下拉选项。

 

六。实现Django的控制层和表现层

 

进行到这里,Django工程中的模型层已经处理完成,下面要做的就是如何用代码来与models中定义的字段进行交互,这就是Django中的View部分。与传统MVC分层定义略有不同的是,在Django中,View的功能是对页面请求进行响应和逻辑控制,而页面内容的表示则由Django的Template模板来完成。我们可以把Django的View理解为实现各种功能的Python函数,View负责接受URL配置文件urls.py中定义的URL转发并响应处理,当Django收到请求之后调用相应的View函数来完成功能,article模块中的views.py文件代码定义如下:

 

from django.shortcuts import render_to_response 
from news.article.models import List 

def news_report(request): 
 article_listing = [] 
 for article_list in List.objects.all(): 
   article_dict = {} 
   article_dict['news_object'] = article_list 
   article_dict['item_count'] = article_list.item_set.count() 
   article_dict['items_title'] = article_list.title
   article_dict['items_complete'] = article_list.item_set.filter(completed=True).count() 
   article_dict['percent_complete'] =
        int(float(article_dict['items_complete']) / article_dict['item_count'] * 100) 
   article_listing.append(article_dict) 
 return render_to_response('news_report.html', { 'article_listing': article_listing }) 

 

这是一段简洁的Python代码,让我们看看在这段代码里面Django的函数做了哪些工作吧:

  • List.objects.all方法返回news列表中所有的记录项,Django可以根据后台数据库转换成相应的SQL语句,在后台数据库中执行并返回查询结果。
  • 每一条article文章都有item_set属性,代表news新闻条目中的每一个item项。如果需要设置查询条件,也可以使用item_set.filter方法来返回符合特定要求的item项。
  • render_to_response函数返回浏览器指定的HTML页面,页面为Django的Template模板,负责展示被请求的页面内容。

在view部分的代码中,已经指定了页面显示模板为news_report.html。其实,在Django工程中创建模板是一件非常方便的事情,下面要在article目录内创建这个模板页面,首先新建一个名为templates的文件夹,然后在这个模板目录里创建所需的news_report.html模板文件,模板的代码如下:

 

                <html> 
 <head> 
   <meta http-equiv="Content-Type" content="text/html" /> 
   <title>新闻统计列表</title> 
 </head> 
 <body> 
   <h1>新闻统计列表</h1> 
{% for list_dict in article_listing %} 
   <ul> 
   	 <li>新闻的分类: {{ list_dict.items_title }}</li> 
     <li>新闻的数目: {{ list_dict.item_count }}</li> 
     <li>已发布的新闻数目: 
           {{ list_dict.items_complete }} ({{ list_dict.percent_complete }}%)</li> 
   </ul> 
{% endfor %} 
 </body> 
</html> 

 

 

一般来说,Django的模板代码和普通的HTML代码看上去没有太大差别,只是添加了Django特定的模板标记,这些标记允许开发者为Django模板添加页面逻辑,比方说将views.py中render_to_response函数返回的数据库结果集显示在页面中,Django特有的标签在模板页里以“{%”作为开始并以“%}”作为结束。嵌入Django模板的变量则以“{{”作为开始并以“}}”结束。

在上面的模板代码里面,用到了标记{% for news_dict in article_listing %}以及{% endfor %}。这样的标记告诉Django模板处理机制循环取出news中的item项输出在页面中,在for循环内部,通过article_listing的属性得到View中对应的数据项字段的值并显示每个news项的Title标题以及news中的item项数目。

当Django的View和Template都已经准备妥当,下面仅需要几步配置来告诉Django存储工程应用的模板位置,这需要对配置文件setting.py中的TEMPLATE_DIRS项进行设置。在本例中加入模板文件"news_report.html"的存储路径就可以让Django把对View进行处理的结果集通过指定模板返回。按照本例应用的结构,TEMPLATE_DIRS参数的内容设置为:

 

'./article/templates',

这里不要忘记Django需要在路径的最末尾添加一个逗号。接下来仅需要设置访问article时的URL转向地址就可以。打开urls.py文件,在admin后台管理的转向地址下一行添加如下语句:

 

(r'^report/$', 'news.article.views.news_report'),

在这里语段的最末尾,也需要有逗号标记段落的结束。在这里可以看到,Django的URL转发设计的非常简洁,在配置文件urls.py中对应于view的转发请求都由两部分组成,第一部分遵循正则表达式指定相匹配的URL地址,第二部分是对应在View里面处理转发请求的函数。

完成了这些步骤,就可以在命令提示符下再次启动Django服务器,看一下上述努力的成果了,在浏览器中打开链接http://127.0.0.1:8000/report/,将会看到新闻列表的返回界面。页面中显示了数据库中已添加所有新闻的分类统计信息。值得一提的是,Django模板支持多层嵌套,并且每一层都可以使用DIV+CSS方式完成布局,可以方便的让站点页面遵循统一风格,看起来美观大方。


 

  • 大小: 43.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics