Django(八)Admin 后台系统

    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的官方文档说明。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容