编码训练:Django开发简易博客(四)

这次重新做一个比较强大点的blog系统,前面三节就当是练手。这次的博客系统主要参考Django Web 开发实战

virtualenv用来建立一个虚拟的python环境,一个专属于项目的python环境。可以从官网下载后,解压进入目录,运行下面命令(注:所有以后的操作都是在win下进行的):

python setup.py install

virtualenv安装后,将其添加到环境变量中,即将;C:\Python27\Scripts添加到PATH里。打开命令窗,进入要创建项目所在的目录,运行下面命令:

virtualenv weblog
cd weblog
cd Scripts
active
pip install django==1.6.5
pip install ipython

ipython是一个比python自带的shell要更强大的交互工具,这里安装它主要方便与于django进行交互。进入weblog,可以查看到有些目录:

cd weblog
dir
2014/05/24  22:03    <DIR>          .
2014/05/24  22:03    <DIR>          ..
2014/04/17  01:14    <DIR>          Include
2014/05/24  21:44    <DIR>          Lib
2014/05/24  22:03    <DIR>          Scripts
2014/05/24  22:03    <DIR>          share
               0 个文件              0 字节
               6 个目录 30,818,910,208 可用字节

接着运行下面命令创建project及app:

python C:\Python27\Scripts\django-admin.py startproject djblog
cd djblog
python C:\Python27\Scripts\django-admin.py startapp blog

进入djblog,打开setting.py,添加下面代码:

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

继续修改,找到DATABASES,将其修改为下面的样子:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),                      # 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.
    }
}

修改完成后,对数据库进行初始化:

python manage.py syncdb

初次同步需要设置登录后台管理的账号、邮箱、密码,设置完后,会在djblog所在的目录生成一个名为db.sqlite3的数据库。回到setting.py,对言语、时区、静态目录位置、模板文件存放路径进行设置。

# 设置语言
LANGUAGE_CODE = 'zh-cn'
# 时区
TIME_ZONE = 'Asia/Shanghai'
STATIC_URL = '/static/'
# 静态文件目录
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

# 模版文件目录
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, "templates"),
)

注意,只要文件中出现了中文,需要加上# -*- coding: utf-8 -*-避免编码错误。完成上面设置后,回到项目djblog所在目录,建立上面对应的静态目录及模板目录:

mkdir templates static

运行上面命令后,会建立templates、static两个目录,再setting.py的INSTALLED_APPS中添加创建了的应用,即blog:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'blog',
)

进入Scripts所在目录,运行下面命令安装south:

pip install south

然后将south添加到setting.py的INSTALLED_APPS中,即:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'blog',
    'south',
)

south可以用于实时更新数据库,也就是启动服务器后,在修改模型时,可以即时同步生效而不用重启服务器。同步数据库:

python manage.py syncdb

可以看到,新建了一个table south_migrationhistory数据表,这个表用于记录South操作的。

编写数据模型:post

编写post模型,使单篇博客包含标题内容作者发布日期四类信息。进入blog所在目录,打开models.py,添加下面代码:

# -*- coding: utf-8 -*-
from django.db import models

# Create your models here.
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(u"标题", max_length=128)
    author = models.ForeignKey(User)
    content = models.TextField(u"内容")
    pub_data = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-id"]

    def __unicode__(self):
        return self.title

    @models.permalink
    def get_absolute_url(self):
        return ('post', (), {'pk': self.pk})

保存后,在终端输入python manage.py sql blog命令后,在终端会出现下面运行结果:

BEGIN;
CREATE TABLE "blog_post" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(128) NOT NULL,
    "author_id" integer NOT NULL REFERENCES "auth_user" ("id"),
    "content" text NOT NULL,
    "pub_data" datetime NOT NULL
)
;
COMMIT;