自强学堂
自强学堂:学习、分享、让你更强!
Django 教程HTMLCSSJAVASCRIPTJQUERYSQLPHPBOOTSTRAPANGULARXML
 

Django 开发内容管理系统

用Django开发一个简易的内容管理系统,比如显示新闻的列表,点击进去可以看内容详情等,新闻发布网站。

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

我们有的时候会发现,一个电脑上有多个项目,一个依赖 Django 1.8,另一个比较旧的项目又要用 Django 1.5,这时候怎么办呢?

我们需要一个依赖包管理的工具来处理不同的环境。如果不想搭建这个环境,可以直接去看 2.2

1.1 环境搭建

开发会用 virtualenv 来管理多个开发环境,virtualenvwrapper 使得virtualenv变得更好用

1
2
# 安装:
(sudo) pip install virtualenv virtualenvwrapper

Linux/Mac OSX 下:

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

1
2
3
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh

Windows 下:

1
pip install virtualenvwrapper-win

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

workon_home.png

1.2 使用方法:

mkvirtualenv zqxt:创建运行环境zqxt

workon zqxt: 工作在 zqxt 环境

其它的:

rmvirtualenv ENV:删除运行环境ENV

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

mktmpenv:创建临时运行环境

lsvirtualenv: 列出可用的运行环境

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

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

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

2.1 创建一个开发环境 minicms

1
2
3
4
5
# Linux 或 Mac OSX
mkproject minicms
 
# windows
mkvirtualenv minicms

Mac OSX 下的输出示例:

1
mkproject minicms

1
2
3
4
5
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.2 安装 Django

1
pip install Django==1.8.3


2.3 创建项目 minicms 和 应用 news

1
2
3
django-admin.py startproject minicms
cd minicms
python manage.py startapp news

添加 news 到 settings.py 中的 INSTALLED_APPS 中。


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

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

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


我们假设一篇文章只有一个作者(文章和作者是多对一的关系),一篇文章可以属于多个栏目(栏目和文章是多对多的关系)

为了用到更多的情况,我们假设作者可以为空,栏目不能为空。


开写 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
33
34
35
36
37
38
39
40
# -*- 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 = '教程'

2.5 创建数据库

1
2
python manage.py makemigrations news
python manage.py migrate

2.6 创建完数据库后,用了一段时间,我们发现以前的文章的字段不合理

比如我们想记录文章添加的日期,修改的日期,我们更改 models.py (不变动的大部分省去了,添加两个字段)

1
2
3
4
5
6
7
8
...省略
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 进行了更改,这些字段数据库中还没有,我们要同步更改到数据库中去:

1
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 文件夹中,我们要执行更改

1
python manage.py migrate 或 python manage.py migrate news

2.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

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2015-07-28 20:38:38
# @Author  : Weizhong Tu (mail@tuweizhong.com)
# @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 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 放在一块,同一个文件夹下)

运行脚本 导入数据:

1
python create_demo_records.py

Done!

终端上显示一个  Done!   就这样 Duang 的一下,数据就导进去了!

上面所有操作的代码:minicms1.zip

第一次提交:github: https://github.com/twz915/django-minicms/tree/dff31758173852344af5d8d5b4fad858a0b16907

内容管理系统继续开发,点此查看第二部分

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
  • 评论
28人参与,28条评论
  • 最新评论
2020年10月21日 4:23 Charles_低调哥

article.column.add(c) 这一句怎么理解?

2019年10月18日 22:19 M1931101 [山东省烟台市网友]

不知咋的,我网页突然充斥很多煽动性的小广告

来自自强学堂wap版
2019年9月24日 5:30 爱过无奈 [辽宁省网友]

那个峰哥,你说下让我死心

2018年6月9日 5:53 [广东省深圳市网友]

老师您好,请问Django实现一个物联网远程监控传感器信息的后台要怎么来做,有没有想关例程demo

2018年5月16日 9:21 胡杨 [四川省成都市网友]

大家知道这个是哪里的问题吗

2018年4月28日 10:08 [北京市网友]
1 [北京市网友]

DoesNotExist: User matching query does not exist. 不知道账号密码

这个在下一个 教程中有,哈哈

2018年4月28日 9:00 [北京市网友]

DoesNotExist: User matching query does not exist.

不知道账号密码

2018年4月3日 4:06 自强学堂网友 [湖南省网友]

涂哥, 你这个网站是Django开发的吗

2018年3月16日 14:08

提一个小错误,create_demo_records.py里面context打成content了

2018年1月12日 3:19 自强学堂网友 [广东省深圳市网友]

怎么修改密码啊

来自自强学堂wap版
2018年1月8日 8:55 自强学堂网友 [江苏省南京市网友]
1 [云南省昆明市网友]

大家千万别用记事本创建 create_demo_records.py 这个文件,别问我是怎么知道的~

写 Python 不要用记事本,文件中会被加一些奇怪的东西,还是用 sublime , notepad++或 PyCharm等来写吧

编码格式改成utf-8就行了。

2017年12月14日 15:38 涂伟忠 管理员
1 [广东省东莞市网友]

涂哥,学玩django后国内好找工作吗,还是学java好?

java 工作应该更好找,但 python 也还好,会越来越火的

2017年12月13日 2:59 [广东省东莞市网友]

涂哥,学玩django后国内好找工作吗,还是学java好?

2017年11月29日 15:47 涂伟忠 管理员
1 [云南省昆明市网友]

大家千万别用记事本创建 create_demo_records.py 这个文件,别问我是怎么知道的~

写 Python 不要用记事本,文件中会被加一些奇怪的东西,还是用 sublime , notepad++或 PyCharm等来写吧

2017年11月29日 11:34 [云南省昆明市网友]

大家千万别用记事本创建 create_demo_records.py 这个文件,别问我是怎么知道的~

2017年11月29日 7:41 [北京市网友]

这些依赖包,需要提前安装好

2017年11月23日 16:19 涂伟忠 管理员
1 [内蒙古自治区网友]

老师 您是否有兴趣接一个网页私活,如果您没时间可不可以帮我推荐下 北京哪家公司比较好

抱歉,这个目前真推荐不了,你如果学习有问题,可以随时给我发邮件。

2017年11月23日 2:13 [内蒙古自治区网友]

老师 您是否有兴趣接一个网页私活,如果您没时间可不可以帮我推荐下 北京哪家公司比较好

2017年11月19日 11:56 [河北省保定市网友]
1 [内蒙古自治区网友]

涂老师,您的这个项目 我没能运行了 还有好多库import错误 。我想在请教一下你 动态创建网页的事 1.前端引入百度编辑器后 如何动态的一键保存到数据库。 2.动态创建的网页一键保存后 如何保存到右侧树目录 3.父页面及父页面以下所有子页面 我想让一个管理员A管理 父页面2 让管理员B管理,管理员B不能编辑父页面,只能编辑自己的父页面2 4.权限继承问题: 我想限制一组人 不能编辑父页面,权限限制后在管理员A管理的父页面创建的所有子页面都会继承父页面的编辑权限 以上这些能做到吗? 希望老师帮助指点一下.

2 [河北省保定市网友]

里面有一个 requirements.txt 是依赖,你应该是没有安装依赖,建议按照教程一步步来。 1. 百度编辑器只是一个可视化编辑数据的工具,保存方式还是 表单 或者 ajax 请求。 2. 建议你了解一下 ajax 3. 这个需要你自己来实现权限管理,可以考虑 django-guardian 权限有表级别,记录级别,字段级别,Django 自带的权限管理可以到表级别,你这个属于记录级别。 4. 一样的,子页面和父页面属于不同的记录,实现时,子页面可以通过父记录实现授权,但只有子记录权限的人只能编辑子页面,不能编辑父页面。 我认为你的需求 django-guardian 能实现,你可以多了解一下。

3 [河北省网友]

感谢涂老师指导。从一个小白到能自己开发网页,在您这学到了很多。感谢

不客气,加油,能帮助你很开心

来自自强学堂wap版
2017年11月19日 11:43 [河北省网友]
1 [内蒙古自治区网友]

涂老师,您的这个项目 我没能运行了 还有好多库import错误 。我想在请教一下你 动态创建网页的事 1.前端引入百度编辑器后 如何动态的一键保存到数据库。 2.动态创建的网页一键保存后 如何保存到右侧树目录 3.父页面及父页面以下所有子页面 我想让一个管理员A管理 父页面2 让管理员B管理,管理员B不能编辑父页面,只能编辑自己的父页面2 4.权限继承问题: 我想限制一组人 不能编辑父页面,权限限制后在管理员A管理的父页面创建的所有子页面都会继承父页面的编辑权限 以上这些能做到吗? 希望老师帮助指点一下.

2 [河北省保定市网友]

里面有一个 requirements.txt 是依赖,你应该是没有安装依赖,建议按照教程一步步来。 1. 百度编辑器只是一个可视化编辑数据的工具,保存方式还是 表单 或者 ajax 请求。 2. 建议你了解一下 ajax 3. 这个需要你自己来实现权限管理,可以考虑 django-guardian 权限有表级别,记录级别,字段级别,Django 自带的权限管理可以到表级别,你这个属于记录级别。 4. 一样的,子页面和父页面属于不同的记录,实现时,子页面可以通过父记录实现授权,但只有子记录权限的人只能编辑子页面,不能编辑父页面。 我认为你的需求 django-guardian 能实现,你可以多了解一下。

感谢涂老师指导。从一个小白到能自己开发网页,在您这学到了很多。感谢

来自自强学堂wap版
2017年11月19日 11:33 [河北省保定市网友]
1 [内蒙古自治区网友]

涂老师,您的这个项目 我没能运行了 还有好多库import错误 。我想在请教一下你 动态创建网页的事 1.前端引入百度编辑器后 如何动态的一键保存到数据库。 2.动态创建的网页一键保存后 如何保存到右侧树目录 3.父页面及父页面以下所有子页面 我想让一个管理员A管理 父页面2 让管理员B管理,管理员B不能编辑父页面,只能编辑自己的父页面2 4.权限继承问题: 我想限制一组人 不能编辑父页面,权限限制后在管理员A管理的父页面创建的所有子页面都会继承父页面的编辑权限 以上这些能做到吗? 希望老师帮助指点一下.

里面有一个 requirements.txt 是依赖,你应该是没有安装依赖,建议按照教程一步步来。
1. 百度编辑器只是一个可视化编辑数据的工具,保存方式还是 表单 或者 ajax 请求。
2. 建议你了解一下 ajax
3. 这个需要你自己来实现权限管理,可以考虑 django-guardian
权限有表级别,记录级别,字段级别,Django 自带的权限管理可以到表级别,你这个属于记录级别。
4. 一样的,子页面和父页面属于不同的记录,实现时,子页面可以通过父记录实现授权,但只有子记录权限的人只能编辑子页面,不能编辑父页面。
我认为你的需求 django-guardian 能实现,你可以多了解一下。

2017年11月16日 11:03 [内蒙古自治区网友]

涂老师,您的这个项目 我没能运行了 还有好多库import错误 。我想在请教一下你 动态创建网页的事
1.前端引入百度编辑器后 如何动态的一键保存到数据库。
2.动态创建的网页一键保存后 如何保存到右侧树目录
3.父页面及父页面以下所有子页面 我想让一个管理员A管理
父页面2 让管理员B管理,管理员B不能编辑父页面,只能编辑自己的父页面2
4.权限继承问题: 我想限制一组人 不能编辑父页面,权限限制后在管理员A管理的父页面创建的所有子页面都会继承父页面的编辑权限
以上这些能做到吗?
希望老师帮助指点一下.

2017年11月14日 8:41 [内蒙古自治区网友]

您好,涂老师
我运行您的这个项目 报错了 您能帮我看下是什么原因吗

2017年11月14日 1:33

涂老师你好!我出现这个问题,我用的python2.7,django版本是1.8.5

2017年11月7日 8:01 [陕西省西安市网友]

项目实战加油更新啊~~~

2017年9月25日 3:07 [北京市网友]

您好您的项目实战还更新吗?

2017年8月21日 16:49 涂伟忠 管理员
1 [北京市网友]

我想问下,我在centos上 执行python manage.py migrate 或 python manage.py migrate news 提示no changes,我执行python manage.py makemigrations也不行,必须加python manage.py makemigrations news 才可以,但是migrate却 没有成功,提示‘No migrations to apply.’

django migrate是依赖 数据库表 django_migrations的,可能里面已经有记录了,你检查一下。
如果不是,我怀疑是你的环境配置有些问题

2017年8月20日 8:11 [北京市网友]

我想问下,我在centos上 执行python manage.py migrate 或 python manage.py migrate news 提示no changes,我执行python manage.py makemigrations也不行,必须加python manage.py makemigrations news 才可以,但是migrate却 没有成功,提示‘No migrations to apply.’

热评话题