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 创建一个脚本,导入一些数据到数据库中
我们导入一些演示数据:
栏目: [
文章:[
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
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 放在一块,同一个文件夹下)
运行脚本 导入数据:
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)
|
-----------------------------------------------------------------------------------------------------------------------------
使用如下命令账号创建超级用户(如果使用了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
对于管理界面的外观的定制还有展示顺序的修改就不详细叙述了, 感兴趣的可以查看官方文档...
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