前言
最近一直在研究一些AI相关的东西,因为AI很多都是 python 实现的,所有也顺带研究一下 python 和相关的框架。之前也经常会写一些 python 的代码,但是真的没写过啥项目,都是一些简单的代码。而这次不同,打算用 python 写一个项目练练手,选择了比较著名的 Django 框架。这个框架之前也是了解过的,但是只停留在看看文档的入门部分,觉得不是很难,记得当时还很惊讶与他有一个现成的后台可以用,但是因为一些原因,并没有深入研究,只是单纯的觉得有一个后台可能也不能满足要求。但是这次发现,这个框架很厉害,后台特别灵活,基本可以满足需求。
介绍
这次通过一个小项目,了解了 Django 的基本使用,并且也了解了一些后台的配置。
项目管理:Django 自带了一个项目管理工具,可以很方便的管理项目。
后台:Django 自带了一个后台,可以很方便的进行后台配置。
ORM:Django 自带了一个 ORM,可以很方便的进行数据库操作。真心很好用。不管是对象关系映射还是直接操作数据库,都特别方便。
数据库迁移:Django 自带了一个数据库迁移工具,可以很方便的进行数据库迁移。
项目管理
Django 自带了一个项目管理工具,可以很方便的管理项目。从项目的创建到开始,一直到项目结束,都可以通过这个项目管理工具来管理项目。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装 Django
pip install Django
# 创建项目
django-admin startproject project_name
# 创建应用
python manage.py startapp app_name
# 查看其他命令
python manage.py -h
# 运行项目
python manage.py runserver
# 执行 shell,这个命令可以进入 shell 模式,然后就可以直接操作数据库
python manage.py shell
后台
Django 自带了一个后台,可以很方便的进行后台配置。执行迁移命令后,就可以通过创建用户来创建一个后台账号,然后就可以通过这个账号登录后台,进行后台配置。这个后台自带用户管理、用户组管理等。第一次接触的时候我觉得这个后台可能并不能满足需求,但是后来发现这个后台还可以自定义,可以很方便的进行后台配置。
激活后台
1
2
3
4
5
6
7
8
# 执行迁移命令
python manage.py migrate
# 创建用户
python manage.py createsuperuser
# 登录后台
# http://127.0.0.1:8000/admin/
后台配置
Django 自带了一个后台,可以很方便的进行后台配置。而配置的方法是通过 admin.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
# 创建数据库模型
# models.py
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
# 注册后台管理
# admin.py
from django.contrib import admin
from . import models
admin.site.register(models.Article)
更多配置
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# 这段代码比较乱,是因为没有好的例子,拿一个项目代码放这里了,又不想把代码公开,草草改了一下
from django.contrib import admin
from .models import Post, Tag
# Register your models here.
# 设置后台站点标题
admin.site.site_header = '我的项目'
# 这个可以在创建、编辑文章的页面编辑tag
class TagInline(admin.StackedInline):
model = Tag
extra = 0
# 这里还可以用装饰器@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
inlines = [TagInline]
# 可编辑字段列,这个可以让这些列在列表里呈现可编辑状态
list_editable = ('title', 'description', "pub_date")
# 展示列
list_display = ("id", 'title', 'description', 'pub_date')
# 连接,列表上下面字段带链接
list_display_links = ("id", "title")
# 搜索字段,列表搜索可以模糊搜索的字段
search_fields = ('title', "description")
# 过滤列,这个可以在列表右侧有一个过滤功能
list_filter = ('title')
# 每页条数
list_per_page = 10
# 过滤列,必须多对多字段,这里没有,所有不能用
# filter_horizontal = ('name',)
# 设置功能选项在哪里
actions_on_top = False
actions_on_bottom = True
# 这里还可以用装饰器@admin.register(Post)
admin.site.register(Post, PostAdmin)
# 这里还可以用装饰器@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
# 可编辑字段列
# list_editable = ('name',)
# 编辑页面的显示(可分栏显示),这不能有id,这个好理解因为id是隐藏的,
# 也不能关联“post__name”
# fields = ('name',)
# fields = (('name', "post"), ('description',))
# 还可以为分组设置名字,不可以与fields同时使用(好像没见到效果)
# fieldsets = (
# ("基本信息", {"fields": ['name', "type"]}),
# ("描述信息", {"fields": ["post", "description"]}),
# )
# # 只读字段
# readonly_fields = ("name",)
# 展示列
list_display = ("id", 'name', 'post__name')
# 连接
list_display_links = ("id", "name")
# 搜索字段
search_fields = ('name', 'post__name')
# 过来列
list_filter = ('post__name', "type")
# 搜索,'__'表示需要关连到其他表中查询
# 每页条数
list_per_page = 10
# 过滤列,必须多对多字段,这里没有,所有不能用
# filter_horizontal = ('name',)
# 设置功能选项在哪里
actions_on_top = False
actions_on_bottom = True
# save栏的位置
# save_on_top = True
# 排序 ,'-'表示降序
ordering = ('-id',)
"""
处理状态的,这里不涉及作为学习资料
from django.utils.html import format_html
status_choices=(
('published',u'已出版'),
('publishing',u'未出版'),
('forbidden',u'禁止出版'),
)
status = models.CharField(choices=status_choices,max_length=32,default='publishing')
def status_color(self):
if self.status == 'published':
format_td = format_html('<span style="padding:2px;color:white">已出版</span>')
if self.status == 'publishing':
format_td = format_html('<span style="padding:2px;color:white">未出版</span>')
if self.status == 'forbidden':
format_td = format_html('<span style="padding:2px;color:white">禁止出版</span>')
return format_td # 将html样式传递给admin展示页面
status_color.short_description = 'status' # admin展示时名称为status(一个别名)
"""
# 这里还可以用装饰器@admin.register(Tag)
admin.site.register(Tag, TagAdmin)
ORM
Django 的 ORM 模块,可以很方便的进行数据库的操作。可以通过python manage.py shell 进入shell,然后就可以进行数据库的操作了。而且包括一对一、一对多、多对多等关系,使用也很方便。
数据库迁移
Django 的 ORM 模块,可以很方便的进行数据库的操作。可以通过python manage.py makemigrations 和 python manage.py migrate 进行数据库迁移。只要在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
# 创建数据库模型
# models.py
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建数据库迁移
python manage.py makemigrations
# 创建指定app的数据库迁移
python manage.py makemigrations news
# 查看数据库迁移
python manage.py sqlmigrate
# 查看指定app的数据库迁移
python manage.py sqlmigrate news 0001
# 执行数据库迁移
python manage.py migrate
# 执行指定app的数据库迁移
python manage.py migrate news