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