rwwh

十四 Admin后台系统

一 Admin后台系统简介

     对网站数据库和文件的快速操作和管理系统,以使网页内容能够及时得到更新和调整.

     在INSTALL_APPS中已配置了Django的Admin后台系统,若网站不需要Admin后台系统,可以将配置信息删除,这样可以减少程序对系统资源的占用.

 

   在访问Admin后台系统时 ,首先需要输入用户的账号和密码登录才能进入后台管理界面.创建用户的账户和密码之前,必须确保项目的模型在数据库中有相应的数据表.

   若Admin后台系统以英文的形式显示,那么需要在项目中settings.py中设置MIDDLEWARE中间件,将后台内容以中文显示.添加的中间件是有先后顺序的,

   完成上述设置后,下一步是创建用户的账户和密码,创建方法由Django的管理工具manage.py

python manage.py createsuperuser

注:在创建用户信息时,用户名和邮箱地址可以为空,如果用户名为空会默认使用计算机的用户名,而设置密码时,输入的密码不会显示在计算机的屏幕上.完成用户创建后,打开数据表auth_user可看到新增了一条用户信息.

在Admin后台系统中可以看到,主要功能分为站点管理,认证和授权,用户和组,说明如下:

站点管理师整个网站的APP管理界面,主要管理Django的APP下所定义的模型;
认证和授权是Django内置的认证系统,也是项目的一个APP;
用户和组是认证和授权所定义的模型,分别对应数据表auth_user和auth_user_group

 在项目中已定义了模型Employee,对应数据表app01_employee.若想将模型展示在Admin后台系统中,则需要在app的admin.py中添加以下代码:

from django.db import models

# Create your models here.
class Employee(models.Model):#必须是models.Model的子类
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=16)
    gender=models.BooleanField(default=1)
    birth=models.DateField()
    department=models.CharField(max_length=30)
    salary=models.DecimalField(max_digits=10,decimal_places=1)
models.py
from django.contrib import admin
from .models import *
# Register your models here.

#方法一
#将模型直接注册到admin后台
#admin.site.register(Employee)

#方法二
#自定义EmployeeAdmin类并继承ModelAdmin
#注册方法一,使用Python装饰器将EmployeeAdmin和模型Employee绑定并注册到后台
@admin.register(Employee)
#自定义EmployeeAdmin类,使其继承ModelAdmin.ModelAdmin主要设置模型信息如何展现在Admin后台系统中
class EmployeeAdmin(admin.ModelAdmin):
    #设置显示字段
    list_display = [\'id\',\'name\',\'birth\',\'department\',\'salary\']

#注册方法二
#admin.site.register(Employee,EmployeeAdmin)
admin.py

 

二 Admin的基本设置

 我们已经将数据表app01_employee成功展示在站点管理的界面,但是对一个不会网站开发的使用者来说,可能无法理解APP01和Employees的含义,而且用英文表示也会影响整个网页的美观.因此需要将APP01和Employees转换成具体的中文内容,将APP01和Employees设置中文显示需要分别使用不同的方法实现,因为APP01和Employees在项目中代表不同的意思,步骤如下:

  步骤一

  首先在app01下的__init__.py中进行如下编码.

 

#Employees设置成中文显示,主要由APP的__init__.py(即app01的__init__.py)文件实现
from django.apps import AppConfig
import os

#修改APP在Admin后台显示的名称
#default_app_config的值来自apps.py的类名
default_app_config = \'app01.IndexConfig\'

# #获取当前APP的命令
def get_current_app_name(_file):
    return os.path.split(os.path.dirname(_file))[-1]


 class IndexConfig(AppConfig):
     name = get_current_app_name(__file__)
     verbose_name = \'网站首页\'
__init__.py

 

 

 

步骤二

  然后将Employees设置中文显示和表中字段也转换成中文,在models.py中设置类Meta的类属性verbose_name_plural即可实现.值得注意的是,Meta的类属性还有verbose_name,两者都能设置Employees的中文内容,但verbose_name是以复数形式表示的,如将Employee是设置为"职工信息",verbose_name会显示成"职工信息s"

from django.db import models

# Create your models here.
class Employee(models.Model):#必须是models.Model的子类
    id=models.AutoField(\'序号\',primary_key=True)
    name=models.CharField(\'姓名\',max_length=16)
    gender=models.BooleanField(\'性别\',default=1)
    birth=models.DateField(\'出生年月\')
    department=models.CharField(\'部门\',max_length=30)
    salary=models.DecimalField(\'工资\',max_digits=10,decimal_places=1)
#若是与其他表有对应关系,如表ap01_author一对一表app01_authordetail,可使用verbose_name属性时使字段转换成中文显示
    #author_detail = models.OneToOneField(to="AuthorDetail", to_field=\'nid\', unique=True, on_delete=models.CASCADE,verbose_name=\'详细信息\')


    #设置返回值
    def __str__(self):
        return self.name

    class Meta:
        #若只设置verbose_name,在Admin只会显示为"职工信息s"
        #verbose_name = "职工信息"
        verbose_name_plural="职工信息"
models.py

 Admin后台管理系统的其他设置

  可以进一步完善Admin网页标题信息,在APP的admin.py中实现:

#修改title和header
admin.site.site_title = "mysite后台管理"
admin.site.site_header = "mysite"

  可以在后台管理系统中添加查找功能

from django.contrib import admin
from .models import *
# Register your models here.


#修改title和header
admin.site.site_title = "mysite后台管理"
admin.site.site_header = "mysite"
#方法一
#将模型直接注册到admin后台
#admin.site.register(Employee)

#方法二
#自定义EmployeeAdmin类并继承ModelAdmin
#注册方法一,使用Python装饰器将EmployeeAdmin和模型Employee绑定并注册到后台
@admin.register(Employee)
#自定义EmployeeAdmin类,使其继承ModelAdmin.ModelAdmin主要设置模型信息如何展现在Admin后台系统中
class EmployeeAdmin(admin.ModelAdmin):
    #设置显示字段
    list_display = [\'id\',\'name\',\'birth\',\'department\',\'salary\']

    #注册方法二
    #admin.site.register(Employee,EmployeeAdmin)
    #设置可搜索的字段并在Admin后台数据生成搜索框,如有外键,应使用双下划线连接两个模型的字段,如type__type_name
    search_fields = ["id","name"]
    #设置过滤器,在后台数据的右侧生成导航栏,如有外键,应使用双下划线连接两个模型的字段,如type__type_name
    list_filter = [\'name\']
    #设置排序方式,[\'id\']为升序,[\'-id\']为降序
    ordering = [\'id\']
    #设置时间选择器,若表中有时间格式才可使用
    date_hierarchy = \'birth\'
    #在添加新数据时,设置可添加数据的字段
    fields = [\'name\',\'birth\',\'department\',\'salary\']
    #设置可读字段,在修改或新增数据时使其无法修改
    readonly_fields = [\'id\']
admin.py

 

三 Admin的二次开发

  可通过重新ModelAdmin的方法可以实现Admin的二次开发.

   函数 get_readonly_fields

     函数get_readonly_fields与属性readonly_fields的功能相似,不过前者比后者更为强大.比如使用函数get_readly_fields实现不同的用户角色来决定字段的可读属性

  

    # 重写get_readonly_fields函数,设置超级用户和普通用户的权限
    #request:当前用户的请求对象   obj:模型对象,默认值为None
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            self.readonly_fields=[]
        return self.readonly_fields

  设置字段格式

   在Admin预览模型Product的数据信息时,数据表的表头是由属性list_display所定义的,每个表的表头的数据都来自于数据库,且数据库以固定字体的字体格式显示在网页中,若要对字段的数据进行特殊处理,如设置数据的字体颜色,以模型Employee的deparment为例,在models.py中自定义函数,设置字体颜色

  #自定义函数,设置字体颜色
    def colored_type(self):
        if \'开发部\' in self.department:
            color_code=\'red\'
        elif "财务部" in self.department:
            color_code = \'blue\'
        else:
            color_code = \'green\'
        return format_html(
            \'<span style="color: {};">{}</span>\',
            color_code,self.department
        )
    #设置Admin的标题
    colored_type.short_description = \'带颜色的部门\'
#在admin.py的EmployeeAdmin中添加自定义字段
list_display.append(\'colored_type\')

注意:

   ①在models.py的模型Employee中定义函数colored_type,函数名可以自行命名,该函数通过判断模型字段的内容,从而返回不同字体颜色.

   ②在admin.py的EmployeeAdmin属性list_display中添加模型Employee的函数colored_type,使该函数以表头形式显示在Admin后台的数据信息页面上

  函数get_queryset

  函数get_queryset根据不同用户设置数据的访问权限

    #admin.py的类EmploeeAdmin
    #根据当前用户名设置数据访问权限
    def get_queryset(self, request):
        qs = super(EmployeeAdmin,self).get_queryset(request)

        if request.user.is_superuser:
            return qs
        else:
            return qs.filter(id__lt=3)

 

函数formfield_for_foreignkey

 函数formfield_for_foreignkey用于在新增或修改数据的时候,设置外键的可选值,如果在模型中将某字段定位为外键类型,当新增数据时,该字段为一个下拉框控件,下拉框中的数据来自于该字段所指向的模型.

# 新增或修改数据时,设置外键可选值
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == \'type\':
            if not request.user.is_superuser:
                kwargs["queryset"] = Type.objects.filter(id__lt=4)
        return super(admin.ModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

 

函数 save_model

   函数save_model是在新增或修改数据的时候,点击保存按钮所触发的功能,该函数主要对输入的数据进行入库和更新处理.若想在这功能中加入一些特殊功能需求,可以对save_model进行重写.比如对数据的修改实现一个日志记录

    #修改保存方法
    def save_model(self, request, obj, form, change):
        #若为True,当前操作为数据修改,反之则为新增
        if change:
            #获取当前用户名
            user = request.user
            #使用模型获取数据,pk代表具有主键属性的字段
            name = self.model.objects.get(pk=obj.pk).name
            #使用表单获取数据
            department = form.cleaned_data[\'department\']
            #写入日志文件
            f = open(\'e://mysite.txt\',\'a\')
            f.write(\'职员:\'+str(name)+\',被用户:\'+str(user)+\'修改\'+\'\r\n\')
            f.close()
        else:pass
        #使用super可使自定义save_model即保留父类已有的功能又添加自定义功能
        super(EmployeeAdmin,self).save_model(request,obj,form,change)


#删除所执行的函数delete_model
def delete_model(self,request,obj):
    pass

super(EmployeeAdmin,self).delete_model(request,obj,form,change)

自定义模板

  Admin后台系统的HTML模板是由Django提供,可以在Django的安装目录下找到Admin模板所在的路径(\Lib\site-packages\django\contrib\admin\templates\admin),若想要对Admin的模板进行自定义更改,可直接修改Django里面的Admin模板,但一般不提倡这种方法.除了这种方法,还可以利用模板继承的方法实现自定义模板开发

 

 

 说明:

   ①文件夹admin代表该文件夹里的模板用于admin后台管理系统,而且文件夹必须命名为admin.

   ②文件夹app01代表项目的APP,文件夹的命名必须与APP的命名一致.该文件夹存放模板文件change_form.html,并且模板文件只适用于app01的后台数据.

   ③若将模板change_form.html放在admin文件夹下,说明该文件适用于当前项目的所有APP.

   ④在项目中创建文件夹templates时,切勿忘记在项目settings.py中配置templates的路径信息.

 具体可见<玩转django2.0 p122页>

 

Django的Admin后台管理系统还提供了许多功能函数,可以查阅Django官方文档.

 

 

  

分类:

技术点:

相关文章: