用Django 如何开发内容管理系统

 

       python开发中,我们常常使用Django来开发简易的内容管理系统,比如:开发显示新闻的列表,从列表中可点击查看具体内容,这种新闻展示型网站。但对于初学者来说,拿到一个内容管理系统的需求,我们往往无从下手。今天我们就和大家分享下,使用Django 开发的操作步骤。

 

一,搭建互不干扰的 Python 包开发环境

      在程序开发中,我们常常会在同一个电脑上面存在多个项目,或许会有一个依赖 Django 1.8,另一个依赖 Django 1.5,这时候我们怎么办呢?

       这个时候,我们就需要一个依赖包管理的工具来处理不同的环境。

 

1环境搭建

丰富经验的程序员都会用 virtualenv 来管理多个开发环境,virtualenvwrapper 使得virtualenv变得更好用。

# 安装:

(sudo) pip install virtualenv virtualenvwrapper

扫描二维码关注公众号,回复: 787526 查看本文章

Linux/Mac OSX 下:

修改~/.bash_profile或其它环境变量相关文件,添加以下语句

 

export WORKON_HOME=$HOME/.virtualenvs

export PROJECT_HOME=$HOME/workspace

source /usr/local/bin/virtualenvwrapper.sh

Windows 下:

pip install virtualenvwrapper-win

【可选】Windows下默认虚拟环境是放在用户名下面的Envs中的,与桌面,我的文档,下载等文件夹在一块的。更改方法:计算机,属性,高级系统设置,环境变量,添加WORKON_HOME

 

 

2、使用方法:

mkvirtualenv zqxt:创建运行环境zqxt

workon zqxt: 工作在 zqxt 环境

 

其它的:

rmvirtualenv ENV:删除运行环境ENV

mkproject mic:创建mic项目和运行环境mic

mktmpenv :创建临时运行环境

lsvirtualenv : 列出可用的运行环境

lssitepackages : 列出当前环境安装了的包

 

创建的环境是独立的,互不干扰,无需sudo权限即可使用 pip 来进行包的管理。

 

二,安装软件,开发 minicms 项目

1、创建一个开发环境 minicms

 

# Linux Mac OSX

mkproject minicms

 

# windows

mkvirtualenv minicms

Mac OSX 下的输出示例:

 

mkproject minicms

New python executable in minicms/bin/python

Installing setuptools, pip...done.

Creating /Users/tu/YunPan/workspace//minicms

Setting project for minicms to /Users/tu/YunPan/workspace/minicms

(minicms)tu@mac ~/YunPan/workspace/minicms $

 

2安装 Django

pip install Django==1.8.3

 

3、创建项目 minicms 应用 news

django-admin.py startproject minicms

cd minicms

python manage.py startapp news

添加 news settings.py 中的 INSTALLED_APPS 中。

 

4、规划 news 中的栏目和每篇文章相关的字段

栏目:名称,网址,简介等

文章:标题,作者,网址,内容等

假设一篇文章只有一个作者(文章和作者是多对一的关系),一篇文章可以属于多个栏目(栏目和文章是多对多的关系),为了用到更多的情况,我们假设作者可以为空,栏目不能为空。

 

开写 models.py

 

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from django.db import models

from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible

class Column(models.Model):

  name = models.CharField('栏目名称', max_length=256)

  slug = models.CharField('栏目网址', max_length=256, db_index=True)

  intro = models.TextField('栏目简介', default='')

  def __str__(self):

    return self.name

  class Meta:

    verbose_name = '栏目'

    verbose_name_plural = '栏目'

    ordering = ['name']  # 按照哪个栏目排序

@python_2_unicode_compatible

class Article(models.Model):

  column = models.ManyToManyField(Column, verbose_name='归属栏目')

  title = models.CharField('标题', max_length=256)

  slug = models.CharField('网址', max_length=256, db_index=True)

  author = models.ForeignKey('auth.User', blank=True, null=True, verbose_name='作者')

  content = models.TextField('内容', default='', blank=True)

  published = models.BooleanField('正式发布', default=True)

  def __str__(self):

    return self.title

  class Meta:

    verbose_name = '教程'

verbose_name_plural = '教程'

 

5、创建数据库

python manage.py makemigrations news

python manage.py migrate

 

6、创建完数据库后,修改以往字段

      在数据库创建完成后,使用一段时间,或许你会发现,以前的字段并不合理,比如我们想记录文章添加的日期,修改的日期,我们更改 models.py (不变动的大部分省去了,添加两个字段)

 

...省略

class Article(models.Model):

  ...原来的字段省去

  pub_date = models.DateTimeField('发表时间', auto_now_add=True, editable=True)

  update_time = models.DateTimeField('更新时间', auto_now=True, null=True)

  ...省略

这时候,我们对 models.py 进行了更改,这些字段数据库中还没有,我们要同步更改到数据库中去:

 

python manage.py makemigrations news

You are trying to add a non-nullable field 'pub_date' to article without a default; we can't do that (the database needs something to populate existing rows).

 

Please select a fix:

 

1) Provide a one-off default now (will be set on all existing rows)

 

2) Quit, and let me add a default in models.py

 

这段话的意思是 pub_date 字段没有默认值,而且非Null 那么

1) 指定一个一次性的值供更改数据库时使用。

2) 停止当前操作,在 models.py 中给定默认值,然后再来migrate

 

我们选择第一个,输入 1

Select an option: 1

Please enter the default value now, as valid Python

The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now()

>>>timezone.now()

Migrations for 'news':

0002_auto_20150728_1232.py:

- Add field pub_date to article

- Add field update_time to article

 

这样是生成了一个对表进行更改的 py 文件在 news/migrations 文件夹中,我们要执行更改

python manage.py migrate python manage.py migrate news

 

7创建一个脚本,导入一些数据到数据库中

 

我们导入一些演示数据:

 

栏目: [<Column: 体育新闻>, <Column: 社会新闻>, <Column: 科技新闻>]

 

文章:[<Article: 体育新闻_1>, <Article: 体育新闻_2>, <Article: 体育新闻_3>, <Article: 体育新闻_4>, <Article: 体育新闻_5>, <Article: 体育新闻会>, <Article: 体育新闻_7>, <Article: 体育新闻_8>, <Article: 体育新闻_9>, <Article: 体育新闻_10>, <Article: 社会新闻_1>, <Article: 社新闻_2>,'...(remaining elements truncated)...']

 

create_demo_records.py

 

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Date     : 2015-07-28 20:38:38

# @Author  : Weizhong Tu ([email protected])

# @Link     : http://www.tuweizhong.com

'''

create some records for demo database

'''

from minicms.wsgi import *

from news.models import Column, Article

def main():

  columns_urls = [

    ('体育新闻', 'sports'),

    ('社会新闻', 'society'),

    ('科技新闻', 'tech'),

  ]

  for column_name, url in columns_urls:

    c = Column.objects.get_or_create(name=column_name, slug=url)[0]

    # 创建 10 篇新闻

    for i in range(1, 11):

      article = Article.objects.get_or_create(

        title='{}_{}'.format(column_name, i),

        slug='article_{}'.format(i),

        content='新闻详细内容: {} {}'.format(column_name, i),

      )[0]

      article.column.add(c)

if __name__ == '__main__':

  main()

  print("Done!")

假设这个文件被保存为 create_demo_records.py (和 manage.py 放在一块,同一个文件夹下)

 

运行脚本导入数据:

 

python create_demo_records.py

Done!

 

终端上显示一个  Done!   OK,数据就导入成功!

 

      以上就是内容管理系统开发的一些简要操作,更多《Django教程》(实战篇)。

猜你喜欢

转载自2789593579.iteye.com/blog/2232496