Django个人博客开发(二)

http://www.dannysite.com/blog/7/

前一部分,我们已经成功创建了博客项目,是时候正是施工了...

这一部分的主要内容:

· 了解Django的开发模式

· 配置数据库

· 创建你的博客APP

· 创建模型

一、Django的MVC模式/MTV模式(摘自《The Django Book》):

Django紧紧地遵循MVC模式,可以称得上是一种MVC框架。 以下是Django中M、V和C各自的含义:

· M:数据存取部分,由django数据库层处理;

· V:选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理;

· C:根据用户输入委派视图的部分,由Django框架根据URLconf设置,对给定URL调用适当的Python函数。

由于C由框架自行处理,而Django里更关注的是模型(Model)、模板(Template)和视图(Views),Django也被称为MTV框架。在MTV开发模式中:

· M代表模型(Model):即数据存取层。该层处理与数据相关的所有事务:如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等;

· T代表模板(Template):即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。

· V代表视图(View),即业务逻辑层。该层包含存取模型及调取恰当模板的相关逻辑。你可以把它看作模型与模板之间的桥梁。

二、配置数据库和创建新的APP:

之前我们已经知道,Django的MTV开发模式中M代表模型(Model),即处理与数据相关的所有事务,存储数据必然要用到数据库,所以第一步,我们需要对此进行配置。

在之前创建项目时,Django为我们生成了一个setting.py文件,打开它并找到如下行:

   DATABASES = {

       'default': {

       'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.

       'NAME': '',                      # Or path to database file if using sqlite3.

       'USER': '',                      # Not used with sqlite3.

       'PASSWORD': '',                  # Not used with sqlite3.

       'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.

       'PORT': '',                      # Set to empty string for default. Not used with sqlite3.

       }

   }

Django支持很多种数据库,如MySQL、PostgreSQL、Oracle、SQLite3等。这里为了方便选用SQLite3,它是一款开源、嵌入式关系型数据库。我使用的是Python 2.6,其内置了sqlite3模块,可以很方便地使用。对之前的settings.py做如下修改:

   'ENGINE': 'django.db.backends.sqlite3'

   'NAME': 修改为你的数据库文件的路径

保存配置,返回到项目根目录下,运行 python manage.py shell,执行如下命令:

   >>> from django.db import connection

   >>> cursor = connection.cursor()

这里,请确保你设置的数据库文件的目录已经的的确确存在了。如果运行以上命令没有出错的话,表明你的数据库配置是正确的。

接下来我们创建一个应用并将其命名为blog:

   [danny@localhost dblog]$ python manage.py startapp blog

执行完成后可以发现目录下多出一个文件夹,这个目录里包含了这个app的模型和视图:

   [danny@localhost blog]$ ls -l

   total 12

   -rw-r--r--. 1 danny danny   0 Nov  2 20:50 __init__.py

   -rw-r--r--. 1 danny danny  57 Nov  2 20:50 models.py

   -rw-r--r--. 1 danny danny 383 Nov  2 20:50 tests.py

   -rw-r--r--. 1 danny danny  26 Nov  2 20:50 views.py

再次编辑settings.py,在INSTALLED_APPS里添加你的应用名称,即“blog”:

   INSTALLED_APPS = (

       'django.contrib.auth',

       'django.contrib.contenttypes',

       'django.contrib.sessions',

       'django.contrib.sites',

       'django.contrib.messages',

       'django.contrib.staticfiles',

       'blog',

    )

三、创建模型:

一切的准备工作都已就绪,现在就该正式开始规划怎么存储博客的数据了,即模型的定义。

Django模型是用Python代码形式表述的数据在数据库中的定义。对数据层来说它等同于CREATE TABLE语句,只不过执行的是Python代码而不是SQL,而且还包含了比数据库字段定义更多的含义。Django用模型在后台执行SQL代码并把结果用Python的数据结构来描述。

回到我们的博客上,一个博客包含标题、作者、发表的时间、分类、标签等内容;而作者肯定有姓名和一些基本的联系方式;分类和标签则可以简单一些,只需要名字就足够了......

下面我们就来描述它:打开刚才创建的blog应用的models.py文件,并输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from  django.db  import  models
            
class  Tag(models.Model):
     tag_name  =  models.CharField(max_length = 20 )
     create_time  =  models.DateTimeField(auto_now_add = True )
            
     def  __unicode__( self ):
         return  self .tag_name
            
class  Classification(models.Model):
     name  =  models.CharField(max_length = 20 )
            
     def  __unicode__( self ):
         return  self .name
            
class  Author(models.Model):
     name  =  models.CharField(max_length = 30 )
     email  =  models.EmailField(blank = True )
     website  =  models.URLField(blank = True )
            
     def  __unicode__( self ):
         return  u '%s'  %  ( self .name)
            
class  Article(models.Model):
     caption  =  models.CharField(max_length = 30 )
     subcaption  =  models.CharField(max_length = 50 , blank = True )
     publish_time  =  models.DateTimeField(auto_now_add = True )
     update_time  =  models.DateTimeField(auto_now = True )
     author  =  models.ForeignKey(Author)
     classification  =  models.ForeignKey(Classification)
     tags  =  models.ManyToManyField(Tag, blank = True )
     content  =  models.TextField()

这里,每个模型相当于单个数据库表,而每个属性也就是这个表中的一个字段。每个数据模型都是 django.db.models.Model 的子类,它的父类 Model 包含了所有必要的和数据库交互的方法。其它的知识点这里就不说了,如果需要进一步了解,可以参考Django的官方文档。

保存并关闭,返回项目根目录下,执行 python manage.py validate,如果返回“0 errors found”,说明你的模型的语法和逻辑都正确。再执行 python manage.py sqlall blog,可以得到如下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
BEGIN ;
CREATE  TABLE  "blog_tag"  (
     "id"  integer  NOT  NULL  PRIMARY  KEY ,
     "tag_name"  varchar (20)  NOT  NULL ,
     "create_time"  datetime  NOT  NULL
)
;
CREATE  TABLE  "blog_classification"  (
     "id"  integer  NOT  NULL  PRIMARY  KEY ,
     "name"  varchar (20)  NOT  NULL
)
;
CREATE  TABLE  "blog_author"  (
     "id"  integer  NOT  NULL  PRIMARY  KEY ,
     "name"  varchar (30)  NOT  NULL ,
     "email"  varchar (75)  NOT  NULL ,
     "website"  varchar (200)  NOT  NULL
)
;
CREATE  TABLE  "blog_article_tags"  (
     "id"  integer  NOT  NULL  PRIMARY  KEY ,
     "article_id"  integer  NOT  NULL ,
     "tag_id"  integer  NOT  NULL  REFERENCES  "blog_tag"  ( "id" ),
     UNIQUE  ( "article_id" "tag_id" )
)
;
CREATE  TABLE  "blog_article"  (
     "id"  integer  NOT  NULL  PRIMARY  KEY ,
     "caption"  varchar (30)  NOT  NULL ,
     "subcaption"  varchar (50)  NOT  NULL ,
     "publish_time"  datetime  NOT  NULL ,
     "update_time"  datetime  NOT  NULL ,
     "author_id"  integer  NOT  NULL  REFERENCES  "blog_author"  ( "id" ),
     "classification_id"  integer  NOT  NULL  REFERENCES  "blog_classification"  ( "id" ),
     "content"  text  NOT  NULL
)
;
CREATE  INDEX  "blog_article_cc846901"  ON  "blog_article"  ( "author_id" );
CREATE  INDEX  "blog_article_337f0fda"  ON  "blog_article"  ( "classification_id" );
COMMIT ;

很明显,你的模型已经变成了SQL语句,确认无误后,最后执行python manage.py syncdb即可将创建的模型同步至数据库。这里系统可能会提示你添加一个超级用户,按步骤添加即可,这个用户可以用于在之后登录Django的站点管理。

这一部分内容就到这里,如需系统学习,可以参考《The Django Book》第五章。


你可能感兴趣的:(Django个人博客开发(二))