Admin站点
使用Django的管理模块,需要按照如下步骤操作:
1.管理界面本地化(可有可无)
2.创建管理员
3.注册模型类
4.自定义管理页面
一、管理界面本地化
在settings.py中设置语言和时区
LANGUAGE_CODE = 'zh-hans' # 使用中国语言
TIME_ZONE = 'Asia/Shanghai' # 使用中国上海时间
二、创建超级管理员
创建管理员的命令如下,按提示输入用户名、邮箱、密码。
python manage.py createsuperuser
如果想要日后修改密码可以输入如下命令:
python manage.py changepassword 用户名
开启服务器,输入如下网站
http://127.0.0.1:8000/admin/
然后输入前面创建的用户名、密码完成登录。
登录成功后界面如下,但是发现并没有我们自己模型的入口,接下来我们开始第三步操作
三、APP应用配置
在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。
在创建应用的时候,Django会向apps.py文件中写入一个该应用的配置类。如:
from django.apps import AppConfig
class BooktestConfig(AppConfig):
name = "booktest"
我们将此类添加到工程settings.py文件中的INSTALLED_APPS列表中,表明注册安装局具备此配置属性的应用。
- AppConfig.name属性表示这个配置类是加载到哪个应用的,每个配置类必须包含此属性,它也是默认自动生成的。
- AppConfig.verbose_name属性用于设置该应用的值观可读的名字,此名字会在Django提供的Admin管理站点中显示,如:
from django.apps import AppConfig
class BooktestConfig(AppConfig):
name = 'booktest'
verbose_name = '图书管理'
四、注册模型类
登录后台管理后,默认没有我们创建的子应用中的定义的模型类,需要在自己应用中的admin.py文件中注册,才可以在后台管理中看到,并且可以进行增删改查等操作。
打开booktest/admin.py文件,编写如下代码:
from django.contrib import admin
from booktest.models import BookInfo, HeroInfo
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
到浏览器中刷新页面,可以看到模型类BookInfo和HeroInfo的管理了。
点击类名称”BookInfo"(图书类)可以进入列表页面,默认的话只有一列。
在列表页面中点击“增加”可以进入增加页面,Django会根据模型类的不同,生成不同的表单控件,按提示填写表单内容后点击“保存”,完成数据创建,创建成功后返回列表页面。
在列表页中点击某行的第一列可以进入修改页。
按照提示进行内容的修改,修改成功后进入列表页。在修改页点击“删除”可以删除一项。
删除:在列表页勾选想要删除的复选框,可以删除多项。
点击执行后进入确认页面,删除后回来列表页面。
五、调整站点信息
Admin站点的名称信息也是可以自定义的。
未调整之前的界面是如下图的:
- admin.site.site_header 设置网站页头
- admin.site.site_title 设置页面标题
- admin.site.index_title 设置首页标语
在booktest/admin.py文件中添加如下信息
from django.contrib import admin
admin.site.site_header = "网页的页头"
admin.site.site_title = "首页的标题"
admin.site.index_title = "首页的标语"
六、修改列表页的展示
修改列表页和编辑页必须先定义和使用Admin管理类
Django提供的Admin管理站点的展示效果可以通过自定义ModelAdmin类来进行控制。
定义管理类需要继承自admin.ModelAdmin类:
from django.contrib import admin
class BookInfoAdmin(admin.ModelAdmin):
pass
使用管理类有两种方式:
-
注册参数
admin.site.register(BookInfo, BookInfoAdmin)
-
装饰器
@admin.register(BookInfo) class BookInfoAdmin(admin.ModelAdmin): pass
1.列表中的列显示哪些字段
list_display = [字段1,字段2,...]
1)打开booktest/admin.py文件,修改BookInfoAdmin类如下:
class BookInfoAdmin(admin.ModelAdmin):
...
list_display = ['id','btitle','bpub_date']
2.每页显示多少数据
默认每页显示100条数据,现在将每页显示更改为3条数据。
class BookInfoAdmin(admin.ModelAdmin):
...
list_per_page = 3
3."操作选项的位置"
顶部显示的属性,设置为True则显示在顶部,设置为False则不显示,默认为True
actions_on_top = True
底部显示的属性,设置为True则显示在底部,设置为False则不显示,默认为False
actions_on_bottom = True
4.右侧栏中的过滤器
属性如下,只能接收字段,会将对应字段的值列出来,用于快速过滤。一般都是用于有重复值多的字段,比如性别。
list_filter = ['gender']
5.搜索框
属性如下,用于对指定字段的值进行搜索,支持模糊查询。列表类型,表示在列表中的这些字段上进行搜索查询。
search_fields = ['btitle','comment']
6.将方法作为列
列可以是模型字段,还可以是模型的方法,要求方法有返回值
通过设置short_description属性,可以设置在admin网页站点中显示列的名称
1)打开booktest/models.py文件,修改BookInfo类如下:
class BookInfo(models.Model):
def pub_date_new(self):
return self.bpub_date.strftime("%Y年%月%日")
# 设置方法字段在admin中显示标题
bpub_date_new.short_description = "发布的日期"
2)打开booktest/admin.py文件,修改BookInfoAdmin类如下:
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id','btitle','pub_date_new']
3)刷新查看结果
注:默认方法列是不能排序的,如果需要排序需要为方法指定排序依据。
admin_order_field = 字段
重新打开booktest/models.py文件,修改BookInfo类如下:
class BookInfo(models.Model):
def pub_date_new(self):
return self.bpub_date.strftime("%Y年%m月%日")
pub_date_new.short_description = "发布的日期"
pub_date_new.admin_order_field = 'bpub_date' #这里一定要写对应之前的那个字段名字
七、关联对象
无法直接关联对象的属性或者方法,但是可以在模型类中封装方法,访问关联对象的成员。
1)打开booktest/models.py文件,修改HeroInfo类如下:
class HeroInfo(models.Model):
def read(self):
return read.hbook.bread
read.short_description = "图书阅读量"
2)打开booktest/admin.py文件,修改HeroInfoAdmin类如下:
class HerInfoAdmin(admin.ModelAdmin):
list_display = ['id','hname','hbook','read']
3)刷新测试结果
八、修改编辑页面的展示
1.显示字段
属性如下:
fields = []
1)点击某行链接,可以转到修改页面,默认效果如下图:
2)打开booktest/admin.py文件,修改BookInfoAdmin类如下:
class BookInfoAdmin(admin.ModelAdmin):
fields = ['btitle','bpub_date']
3)刷新效果如下:
2.分组显示
属性:
fieldsets = (
('组1标题',{'fields':('字段1','字段2')}),
('组2标题',{'fields':('字段3','字段4')}),
)
1)打开booktest/admin.py文件,修改BookInfoAdmin类如下:
class BookInfoAdmin(admin.ModelAdmin):
fieldsets = (
('基本', {'fields': ['btitle', 'bpub_date']}),
('高级', {
'fields': ['bread', 'bcomment'],
# 是否折叠显示
'classes': ('collapse',)
})
)
2)刷新查看结果如下:
3.关联对象
在一对多的关系中,可以在一端的编辑页面中编辑多端的对象,嵌入多端对象的方式包括表格和块两种
- 类型InlineModelAdmin : 表示在模型的编辑页面嵌入关系模型的编辑
- 子类TabularInline :以表格的形式嵌入
- 子类StackedInline :以块的形式嵌入
1)打开booktest/admin.py文件,创建HeroInfoStackInline类
class HeroInfoStackInline(admin.StackeInline):
model = HeroInfo # 要便阿吉的对象
extra = 1 # 附加编辑的条数
2)打开booktest/admin.py文件,修改BookInfoAdmin类如下:
class BookInfoAdmin(admin.ModelAdmin):
inlines = [HerInfoStackInline]
3)刷新结果效果如下:
可以使用表格的形式嵌入:
1)打开booktest/admin.py文件,创建HeroInfoTabularInline类
class HeroInfoTabularInline(admin.TabularInline):
model = HeroInfo
extra = 1
2)打开booktest/admin.py文件,修改BookInfoAdmin类如下:
class BookInfoAdmin(admin.ModelAdmin):
inlines = [HeroInfoTabularInline]
3)刷新结果如下:
九、上传图片
Django有提供文件系统支持,在Admin站点中可以轻松上传图片。
使用Admin站点保存图片,需要安装Python的图片操作包
pip install Pillow
1.配置
默认情况下,Django会将上传的图片保存在本地服务器上,需要配置保存的路径。
我们可以将上传的文件保存在静态文件目录下,如我们之前设置的starc_img目录下
在settings.py文件中添加如下,上传保存目录的信息
MEDIA_ROOT = os.path.join(BASE_DIR,'static_img/Media')
# 这个Media是自己创建的目录,用于保存上传的文件
2.给模型类添加ImageFiled字段
打开bootest/models.py文件,为以前的BookInfo类添加一个图片字段
class BookInfo(models.Model):
image = models.ImageFiled(upload_to = 'booktest',null = True,varbose_name = '图片')
# 设置null是因为以前的字段中没有图片,所以默认设置为空
# upload_to 选项指明该字段的图片保存在MEDIA_ROOT目录中的哪个子目录
因为修改了模型类的字段,所以需要数据库迁移
python manage.py makemigrations
python manage.py migrate
3.使用Admin站点上传图片
进入Admin站点的图书管理页面,选择一个图书,然后会发现多出来一个图片字段。
点击选择文件,然后选择一张图片
然后文件会被保存在static_img/media/booktest目录下。
在数据库中我们也能给看到imgae字段的图片路径。