django 开发内容管理系统(已纠正)

django 1.7.11

python 2.7.6

ubantu 14.04

请让unbantu支持中文


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 创建一个脚本,导入一些数据到数据库中

我们导入一些演示数据:

栏目: [, , ]

文章:[, , , , , , , , , , , ,'...(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 ([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  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!


2.8 完善后台的功能,在后台添加,编辑,删除数据


更改 news/admin.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from  django.contrib  import  admin
 
from  .models  import  Column, Article
 
 
class  ColumnAdmin(admin.ModelAdmin):
     list_display  =  ( 'name' 'slug' 'intro' ,)
 
 
class  ArticleAdmin(admin.ModelAdmin):
     list_display  =  ( 'title' 'slug' 'author' 'pub_date' 'update_time' )
 
 
admin.site.register(Column, ColumnAdmin)
admin.site.register(Article, ArticleAdmin)


-----------------------------------------------------------------------------------------------------------------------------

3.创建超级用户

使用如下命令账号创建超级用户(如果使用了python manage.py syncdb会要求你创建一个超级用户, 该命令已经过时, 不再推荐使用)

$ python manage.py createsuperuser
Username (leave blank to use 'andrew_liu'): root
Email address:
Password:
Password (again):
Superuser created successfully.

输入用户名, 邮箱, 密码就能够创建一个超级用户

启动应用:

$ python manage.py runserver localhost:9000

现在可以在浏览器中输入localhost:9000/admin输入账户和密码进入后台管理, 如下:

登陆进入

但是你会发现并没有数据库信息的增加和删除, 现在我们在my_blog/article/admin.py中增加代码:

from django.contrib import admin
from article.models import Article

# Register your models here.
admin.site.register(Article)

保存后, 再次刷新页面, localhost:9000/admin

对于管理界面的外观的定制还有展示顺序的修改就不详细叙述了, 感兴趣的可以查看官方文档...

4.使用第三方插件

Django现在已经相对成熟, 已经有许多不错的可以使用的第三方插件可以使用, 这些插件各种各样, 现在我们使用一个第三方插件使后台管理界面更加美观, 目前大部分第三方插件可以在Django Packages 中查看,

尝试使用django-admin-bootstrap美化后台管理界面

安装

$ sudo pip install bootstrap-admin

配置

然后在my_blog/my_blog/setting.py中修改INSTALLED_APPS

INSTALLED_APPS = (
    'bootstrap_admin',  #一定要放在`django.contrib.admin`前面
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'article',
)

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)
BOOTSTRAP_ADMIN_SIDEBAR_MENU = True

保存后, 再次刷新页面, localhost:9000/admin

界面是不是美腻了许多...


----------------------------------------------------------------------------------------------------------------------



创建一个超级管理员(如果你没有后台帐户和密码的话)

1
python manage.py createsuperuser

这里我们打开开发服务器,访问后台网址,就可以看到:

1
2
3
python manage.py runserver
还可以指定端口 python manage.py runserver 8002
也可以监视所有本机IP, python manage.py runserver 0.0.0.0:8001

后台首页:


后台栏目列表:


后台文章列表:


文章编辑页面:


我们已经可以在后台进行更改和保存文章了,但是在编辑新闻的时候是不是觉得不爽,没有一个编辑器,我们下面来集成百度的Ueditor 到我们的系统:


参考:http://www.ziqiangxuetang.com/django/django-cms-develop2.html

https://www.shiyanlou.com/courses/487/labs/1622/document

你可能感兴趣的:(Python开发)