一、将model注册到后台

以 中的model为例。在我们的APP目录下修改admin.py文件:

1
2
3
4
from django.contrib import admin
from demo import models

admin.site.register(models.Student)

然后在我们的后台可以看到:

然后我们点开Students看到:

这个样子我们什么都看不到,怎么才能想系统默认的那样看到各个字段的情况呢(自己插入点任意数据)?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT student VALUES(1,"刘备","******","liubei@163.com","yes","daye"),
(2,"狄仁杰","******","direnjie@163.com","no","sheshou"),
(3,"后裔","******","houyi@163.com","yes","sheshou"),
(4,"貂蝉","******","diaochan@163.com","no","fashi"),
(5,"妲己","******","daji@163.com","yes","fashi"),
(6,"李元芳","******","liyuanfang@163.com","no","sheshou"),
(7,"诸葛亮","******","zhugeliang@163.com","yes","fashi"),
(8,"蔡文姬","******","caiwenji@163.com","no","fuzhu"),
(9,"孙尚香","******","sunshangxiang@163.com","yes","sheshou"),
(10,"小乔","******","xiaoqiao@163.com","no","fashi"),
(11,"典韦","******","dianwei@163.com","yes","daye"),
(12,"墨子","******","mozi@163.com","no","fashi"),
(13,"张飞","******","zhangfei1@163.com","yes","fuzhu"),
(14,"大乔","******","daqiao1@163.com","no","fuzhu"),
(15,"老夫子","******","laofuzi1@163.com","yes","daye"),
(16,"张良","******","zhangliang1@163.com","yes","fashi");

二、自定义数据展示样式

在我们的APP目录下修改admin.py文件:

1
2
3
4
5
6
7
from django.contrib import admin
from demo import models

class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role')

admin.site.register(models.Student,Student) # 注意第二个参数就是上面定义的

通过定义list_display来定制我们展示的内容:

可以看到我们指定的字段已经全部显示。

三、添加搜索框

同样的在admin.py文件中:

1
2
3
4
5
6
7
8
from django.contrib import admin
from demo import models

class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role')
search_fields = ('username','role') # 注意这里

admin.site.register(models.Student,Student)

通过search_fields属性来指定搜索的字段条件,界面如下:

比如我们输入role字段的值打野,然后搜索:

四、添加过滤器

同样的在admin.py文件中:

1
2
3
4
5
6
7
8
9
from django.contrib import admin
from demo import models

class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role')
search_fields = ('username','role')
list_filter = ('role',)

admin.site.register(models.Student,Student)

通过list_filter属性来添加过滤器,也可以添加多个字段来添加多个过滤器:

可以发现右侧增加了过滤器,且点击了射手显示的数据。

五、设置每页显示的条数

1
2
3
4
5
6
7
8
9
10
from django.contrib import admin
from demo import models

class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role')
search_fields = ('username','role')
list_filter = ('role',)
list_per_page = 4 # 设置每页显示的条数

admin.site.register(models.Student,Student)

通过list_per_page设置每页显示4条数据(清空我们的所有条件和过滤器):

六、编辑每行字段

1
2
3
4
5
6
7
8
9
10
11
from django.contrib import admin
from demo import models

class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role')
search_fields = ('username','role')
list_filter = ('role',)
list_per_page = 4 # 设置每页显示的条数
list_editable = ('email',)

admin.site.register(models.Student,Student)

通过list_editable属性使得邮箱可编辑,可以直接保存:

我们通过修改邮箱,然后点击保存,会发现在顶部提示修改是否成功。

七、排序

1
2
3
4
5
6
7
8
9
10
11
12
from django.contrib import admin
from demo import models

class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role','have_color')
search_fields = ('username','role')
list_filter = ('role',)
list_per_page = 4 # 设置每页显示的条数
list_editable = ('email','role',)
ordering = ('id',)

admin.site.register(models.Student,Student)

我们发现现在默认是倒序排列,可以通过ordering属性来实现排序:

八、给role字段添加选项

在数据库表中role字段很明显是固定的几个值(打野、法师、射手、辅助),我们使用选择固定在来修改,在models.py中修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.db import models
from django.contrib import admin

class Student(models.Model):
id=models.AutoField(max_length=100,primary_key=True)
username=models.CharField(max_length=100)
password=models.CharField(max_length=100)
email=models.CharField(max_length=100)

role_choices=(
('daye','打野'),
('fashi','法师'),
('sheshou','射手'),
('fuzhu','辅助'),
)

role=models.CharField(choices=role_choices,max_length=100,default='daye')

def __unicode__(self):
return self.name
class Meta:
db_table = u'Student'

使用role_choices来列举出所有值,然后修改role字段,也就是增加choices=role_choices和默认值,默认字段一定要加,不然同步数据库会出错,同步数据库:

1
2
3
4
5
6
7
8
9
10
Sing-2:hello Sing$ python manage.py makemigrations  # 还是这两个命令
Migrations for 'demo':
0005_auto_20171025_0410.py:
- Alter field role on student
Sing-2:hello Sing$ python manage.py migrate # 还是这两个命令
Operations to perform:
Apply all migrations: admin, auth, sessions, contenttypes, demo
Running migrations:
Rendering model states... DONE
Applying demo.0005_auto_20171025_0410... OK

然后运行服务器查看效果:

九、Admin中添加Actions

首先在models.py添加一个字段have,代表是否拥有此英雄,值为yesno,如果拥有,则显示拥有切绿色背景白色字,否则显示未有切红色背景黑色字:

1
2
3
4
5
6
7
8
9
10
11
12
# 引入html
from django.utils.html import format_html

# 在 Student 中定义方法
class Student(models.Model):
...
def have_color(self):
if self.have=='yes':
format_td=format_html('<span style="padding:5px;background-color:green;color:white">拥有</span>')
if self.have=='no':
format_td=format_html('<span style="padding:5px;background-color:red;color:black">未有</span>')
return format_td # 将html样式传递给admin展示页面

然后在admin.py中添加选择的方法:

1
2
3
4
5
def make_have(modelAdmin,request,queryset): #queryset是选中的对象的集合
queryset.update(have='yes')

def make_no_have(modelAdmin,request,queryset):
queryset.update(have='no')

很好理解,执行的时候将修改have字段的值,然后在Student中注册actions

1
2
3
4
5
6
7
8
9
10
11
class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role','have_color')
search_fields = ('username','role')
list_filter = ('role',)
list_per_page = 4 # 设置每页显示的条数
list_editable = ('email','role',)
ordering = ('id',)

actions = [make_have,make_no_have] # 上面的那两个方法

admin.site.register(models.Student,Student)

注意在list_display中添加have_color字段,对应model中的方法名,看效果:

十、以指定的名字显示列名


目前的显示方式是默认的,我们可以在models.py中通过verbose_name属性来指定显示名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Student(models.Model):
id=models.AutoField(verbose_name='id',max_length=100,primary_key=True)
username=models.CharField(verbose_name='姓名',max_length=100)
password=models.CharField(verbose_name='密码',max_length=100)
email=models.CharField(verbose_name='邮箱',max_length=100)
have=models.CharField(verbose_name='是否拥有',max_length=100)

role_choices=(
('daye','打野'),
('fashi','法师'),
('sheshou','射手'),
('fuzhu','辅助'),
)

role=models.CharField(verbose_name='角色',choices=role_choices,max_length=100,default='daye')
....

而我们显示的have_color则需要通过short_description来指定别名:

1
have_color.short_description='have'

而在我们的网页端选择Action的时候显示的也是英文,也可以用这种方法指定别名,我们的最终效果:

最终的models.pyadmin.py代码:

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
from django.db import models
from django.contrib import admin
from django.utils.html import format_html

class Student(models.Model):
id=models.AutoField(verbose_name='id',max_length=100,primary_key=True)
username=models.CharField(verbose_name='姓名',max_length=100)
password=models.CharField(verbose_name='密码',max_length=100)
email=models.CharField(verbose_name='邮箱',max_length=100)
have=models.CharField(verbose_name='是否拥有',max_length=100)

role_choices=(
('daye','打野'),
('fashi','法师'),
('sheshou','射手'),
('fuzhu','辅助'),
)

role=models.CharField(verbose_name='角色',choices=role_choices,max_length=100,default='daye')

def __unicode__(self):
return self.name
class Meta:
db_table = u'Student'
verbose_name_plural=u'用户'

def have_color(self):
if self.have=='yes':
format_td=format_html('<span style="padding:5px;background-color:green;color:white">拥有</span>')
if self.have=='no':
format_td=format_html('<span style="padding:5px;background-color:red;color:black">未有</span>')
return format_td # 将html样式传递给admin展示页面

have_color.short_description='是否拥有' # admin展示时名称为have(一个别名)

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
from django.contrib import admin
from demo import models

# 将指定集合改为拥有
def make_have(modelAdmin,request,queryset): #queryset是选中的对象的集合
queryset.update(have='yes')

# 将指定集合改为未有
def make_no_have(modelAdmin,request,queryset):
queryset.update(have='no')

class Student(admin.ModelAdmin):
list_display = ('id','username','password','email','role','have_color') # 显示的字段
search_fields = ('username','role') # 可以搜索的字段
list_filter = ('role',) # 过滤器的字段
list_per_page = 4 # 设置每页显示的条数
list_editable = ('email','role',) # 可编辑字段
ordering = ('id',) # 排序

actions = [make_have,make_no_have]
make_have.short_description='拥有' # 给action指定别名
make_no_have.short_description='未有' # 给action指定别名

admin.site.register(models.Student,Student) # 注册