美文网首页
Django(八)Admin 后台系统

Django(八)Admin 后台系统

作者: 虐心笔记 | 来源:发表于2019-08-18 12:28 被阅读0次

        Admin后台系统主要用于对网站前台的信息进行管理。简单来说,就是对网站数据库和文件袋 快速操作和管理系统。使网页内容能够及时得到更新和调整。当网站上线之后,是通过网站后台系统对网站进行管理和维护的。Django内置了强大的admin后台系统,从配置文件settings.py可以看到项目默认启用了Admin后台系统。

        在Admin后台系统主要功能分为站点管理、认证、授权、用户、组等,相关说明如下:

            1.站点管理是整个网站的APP管理界面,主要管理Django的APP下所定义的模型。

            2.认证和授权是Django内置的认证系统,也是项目的一个APP。

            3.用户和组是认证和授权所定义的模型,分别对应数据表auth_user和auth_user_groups

        在MyDjango项目中,index定义模型Product和Type,分别对应数据表index_produc、index_type。如果想将index定义的模型展示在Admin后台系统中,则需要在index的admin.py添加一下代码:

    from django.contrib import admin

    from .models import *

    # 方法一

    #  将模型直接注册到admin后台

    admin.site.register(Product)

    #  方法二

    ## # 自定义ProductAdmin类并继承ModelAdmin

    @admin.register(Product)

    class ProductAdmin(admin.ModelAdmin):

        # 设置显示的字段

        list_display = ['id', 'name', 'weight', 'size', 'type',]

        # 注册方法二# admin.site.register(Product, ProductAdmin)

        上述代码以两种方法将数据表注册到Admin后台系统,方法一是基本的注册方式:方法二是通过类的继承方式实现注册。日常的开发都是采用第二种方法实现的,实现过程如下:

        1.自定义ProductForm类,使其继承ModelAdmin。主要设置模型信息如何展现在Admin后台系统中。

        2.将ProductAdmin类注册到Admin后台系统中有两种方法,两者都是将模型Product和ProductAdmin类绑定并注册到Admin后台系统。


    Admin的二次开发

        上述简单讲述了Admin的基本设置,但实际上网站的功能和需求都是各部相同的,因此通过重写ModelAdmin的方法可以实现Admin的二次开发,可以妈祖多方面的开发需求。

        函数 get_readonly_dields和属性readonly_fields的功能差不多,不过前者比后者的功能更加强大,它可以实现不同的用户角色来决定字段的刻度属性,实现代码如下:

    # 重写get_readonly_fields 函数,设置超级用户和普通用户的权限

    def get_readonly_dields(self, request, obj=None):

        if request.user.is_superuser:

            self.readonly_fields = []

        else:

            self.readonly_fields = ["name"]

        return self.readonly_fields


     函数getreadonly_fields

    函数getreadonly_fields首先判断当前发型请求的用户是否为超级用户,如果符合,将重新设置readonly_fields属性,使其具有所有的编辑权限。不同的用户身份对字段name的操作权限也有所不同。

        如果想要对下拉框中的数据实现过滤功能,可以怼函数 formfield_for_forignkey进行重写,代码如下:

    # 新增或修改数据时,设置外键可选值

    def formfield_for_foreignkey(self, db_field, request, **kwargs):

        if db_field.name == "type":

            kwargs["queryset"] = Type.object.filter(id__lt=4)

        return super(admin.ModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

        上述代码通过重写函数formfield_for_foreignkey, 实现下拉框的数据过滤,具体说明如下:

        1. 参数db_field是模型Product的外键对象,一个模型可以定义多个外键,因此函数先手对外键 名进行判断。

        2. 然后判断当前用户是否是超级用户,参数request是当前用户的请求对象。

        3.如果当前用户为普通用户,则设置参数kwargs的queryset,参数kwargs是以字典的形式作为函数参数,queryset是参数kwargs的键。

        4. 最后将设置好的参数kwargs传递给父类的函数 formfield_for_foreignkey重新执行。


     函数 save_model

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

    # 修改保存方法

    def save_model(self, request, obj, form, change):

        if change:

            user = request.user  #  获取当前用户名

            name = self.model.objects.get(pf=obj.pk).name  # 使用模型获取数据,pk代表具有主键属性的字段

            weight = form.cleaned_data["weight"]  # 使用表单获取数据

            f = open("e://MyDjango_log.txt", "a")  # 写入日志文件

            f.write("产品:"+str(name) +"被用户:" + str(user) + "修改" + "\r\n" )

            f.close()

        else:

            pass

        # 使用super可以使自定义save_model既保留父类已有的功能又添加自定义功能

        super(ProductAdmin, self).save_model(request, obj, form, change)

        上述代码中,函数save_model 的功能说明如下:

        1. 首先判断参数change是否为True,则说明当前操作为数据修改,反正为新增数据。

        2. 分别从三个函数参数中获取相关的数据内容,参数request代表当前用户的请求对象,参数obj代表当前数据所对应的模型对象,参数form代表Admin的数据修改页面所对应的数据表单。

        3. 然后将获取的数据写入文本log文件中,实现简单的日志记录功能。

        4. 最后使用super方法使重写函数save_model执行原有函数的功能,对数据进行入库和变更处理。若将此代码注释,当触发重写函数时,程序只执行日志记录功能,并不执行数据入库和变更处理。

        除此之外i,还有数据产出所执行的函数 delete_model,代码如下:

    def delete_model(self, request, obj):

        pass

        super(ProductAdmin, self).delete_model(request, obj)


    自定义模板

        admin后台系统的HTML模板是由Django提供,如果想对admin的模板进行自定义更改,可以直接修改Django里面的Admin模板。但是一般体提倡这种用法。除了这种方法之外,还可以利用模板继承的方法实现自定义模板的开发。

        在项目中创建模板文件夹templates,在目录下依次创建admin和index,说明如下:

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

        2. 文件夹index代表项目的app,文件夹的命名必须与APP的命名一直,该文件夹存放模板文件change_form.html,并且模板文件值适用于index的后台数据。

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

        值得注意的是,在项目中创建文件夹templates时,切记在项目 setting.py 中配置templates的路径信息。最后在模板 change_form.html中编写以下代码:

    {% extends "admin/change_form.html" %}

    {% load i18n admin_urls static admin_modify %}

    {% block object-tools-items %}

    {# 判断当前用户角色 #}

    {% if request.user.is_superuser %}

    <li>

        {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}

        <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>

    </li>

    {# 判断结束符 #}

    {% endif %}

    {% if has_absolute_url %}

    <li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>

    {% endif %}

    {% endblock %}

        从代码可以看到,自定义模板change_form.html的代码说明如下:

        1. 自定义模板 change_form.html 首先继承自Admin源模板 change_form.html, 自定义模板的命名必须与源模板的命名一致。

        2. 列入源模板 admin/change_form.html 导入了标签 {% load i18n admin_urls static admin_modify %}, 因此自定义模板 change_form.html 也需要导入该模板标签。

        3. 通过使用block标签实现源模板的代码重写。源模板的代码是以{% block xxx %}形式分块处理,将网页上的不同的功能都一一区分了,因此,在定义模板中使用block标签可对某个功能进行自定义开发。

        项目运行时,程序优先查找项目文件夹admin的模板文件,若找不到响应的模板文件,再从Django中的admin源模板中查找。除了上述列子之外,Django的Admin后台系统还童工了许多功能函数,有兴趣的同学可以去官网查看Django的官方文档说明。

    相关文章

      网友评论

          本文标题:Django(八)Admin 后台系统

          本文链接:https://www.haomeiwen.com/subject/pzbhsctx.html