目录
Admin后台系统也称为网站后台管理系统,主要对网站的信息进行管理,如文字、图片、影音和其他日常使用的文件的发布、更新、删除等操作,也包括功能信息的统计和管理,如用户信息、订单信息和访客信息等
简单来说,它是对网站数据库和文件进行快速操作和管理的系统,以使网页内容能够及时得到更新和调整
1.Django5内置Admin系统初体验
网站管理员通过网站后台系统对网站进行管理和维护
Django 已内置Admin后台系统
在setting中可查看
urls中自动定义了Admin映射:
输入http://127.0.0.1:8000/admin/进入网页:
网页默认英文,可以在setting的中间件中设置:
系统自带的数据库表单有6个,其中auth_user是存放管理员信息,默认无数据
通过manage. py的createsuperuser命令来创建超级管理员的账号密码:
输入 createsuperuser
命令,提示让我们输入用户名,再输入邮箱,以及密码和确认密码,最终可以强制输入y,确认
可以在页面登录:
在Admin后台系统中可以看到,网页布局分为站点管理、认证和授权、用户和组,分别说明如下:
站点管理是整个Admin后台的主体页面,整个项目的App所定义的模型都会在此页面显示。
认证和授权是Django内置的用户认证系统,包括用户信息、权限管理和用户组设置等功能。
用户和组是认证和授权所定义的模型,分别对应数据表auth_user和 auth_user_groups。
2.Django5注册模型到Admin系统
开发业务项目时,可以将模块注册到Admin系统,让Admin系统来维护这些模型
也就是在Admin后台自动给模型实现增删改查功能
注册模型到Admin系统有两个方式
2.1方式一 直接注册
直接将模型注册到admin后台,以BookType为例:
在admin.py中添加语句:
结果:
可对其进行增删改查操作
2.2方法二 自定义类
继承ModelAdmin,以BookInfo为例:
在admin.py中创建模型
结果:
也可以进行增删改查工作
ModelAdmin类里看下,可以对模型的增删改查操作做精细化的配置,包括显示字段,分页,可编辑字段,查询字段,排序等
3.Django5内置Admin系统自定义设置
在使用Django5的内置Admin系统时会发现一些默认的设置,并不符合业务需求,需要自定义设置
可以修改模块名称
在项目下的apps.py中,配置类中加入代码:
结果:
网站标题和子标题也可更换:
在admin.py中设置:
结果:
头部标题也可替换:
在admin.py中设置:
结果:
4.Django5内置Admin系统二次开发
4.1创建普通管理员
点击认证和授权模块下用户右侧的添加按钮:
输入信息之后保存
为其添加管理员状态:
给予用户权限:
最后点击保存
可以重新登录新的管理员账号:
4.2设置不可编辑字段
业务开发时,有时候一些敏感字段,不允许普通管理员修改。可以通过重写ModelAdmin的get_readonly_fields()方法实现
在admin下的自定义类型中进行重写:
可以点击修改,发现图书名称不可修改:
可在模型中为英文字段添加字段名称:
可以在models.py里,加下verbose_name配置即可
结果:
若登录的为超级管理员,可编辑所有内容
当然还有很多细粒度设置的方法,如下
formfield_for_foreignkey() 设置外键下拉框过滤筛选
formfield_for_foreignkey() 重写外键下拉框数据,比如增加下拉选项。
save_model() 添加或者修改处理逻辑重写 ,可以增加一些日志等处理。
等等...
4.3自定义Admin模版
Admin后台管理系统的模版文件和Django框架内置提供的,我们可以在源码里找到
在.venv --> Lib --> site-packages --> django --> contrib --> admin --> templates下
提倡在项目的模块项目的templates下,通过优先级来实现修改模版
方法如下:
在项目下的templates下,新建admin目录,然后admin目录下创建要覆盖的模版名称
从django源码里复制一份源码,贴进去,然后根据需求进行修改:
从测试角度来进行删除代码:
5.Django5内置Auth认证系统
在开发一个网站的时候,无可避免的需要设计实现网站的用户系统
Django作为一个完美主义者的终极框架,内置了强大的用户认证系统--auth,默认使用 auth_user 表来存储用户数据
5.1用户注册实现
实现Auth认证系统里的用户注册的话,用的是auth模版models.py里定义的User模型
在.venv --> Lib --> site-packages --> django --> contrib --> auth下
通过auth内置的User,可以直接操作用户相关功能
在views中添加to_register和register两个方法
增用户用的是create_user,判断用户是否存在通过filter
在url中添加映射:
在templates下新建auth,再新建login和register页面:
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
登录页面
</body>
</html>
register.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/auth/register" method="post">
{% csrf_token %}
<table>
<tr>
<th>用户注册</th>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="{{ username }}"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value="{{ password }}"></td>
</tr>
<tr>
<td>
<input type="submit" value="提交">
</td>
<td>
<font color="red">{{ errorInfo }}</font>
</td>
</tr>
</table>
</form>
</body>
</html>
结果:
auth_user表:
5.2用户登录实现
用户登录功能,后端验证主要通过auth模块提供的authenticate校验方法,以及login登录方法实现
在views中添加to_login和login方法:
通过auth.authenticate校验用户是否已经存在
校验用户成功后,返回的是一个封装好的用户对象;校验错误则返回None
用户对象is_active方法判断用户是否激活
通过调用auth.login,用户登录成功之后,返回给客户端登录的凭证或者说是令牌、随机字符串,则不需要去操作diango_session表,会自动创建session
当执行完`auth.authenticate`和`auth.login`后,也就是登录成功后,就可以通过`request.user`直接获取到当前登录的用户对象数据
登录成功的情况下,该方法获得的是登录用户对象
登录不成功的情况下,该方法获得的是匿名对象`AnonymousUser`
urls中添加映射:
修改login.html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="/auth/login" method="post">
{% csrf_token %}
<table>
<tr>
<th>用户登录</th>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="{{ username }}"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value="{{ password }}"></td>
</tr>
<tr>
<td>
<input type="submit" value="提交">
</td>
<td>
<font color="red">{{ errorInfo }}</font>
</td>
</tr>
</table>
</form>
</body>
</html>
新增index页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>网站首页</title>
</head>
<body>
网站首页,欢迎: {{ request.user }}
</body>
</html>
结果:
账号密码正确:
账号密码错误:
5.3用户修改密码实现
用户修改密码主要通过request.user对象的set_password实现,当然校验原密码用check_password,设置完后,需要保存,调用save()方法
在views中添加setPwd方法:
urls添加映射:
新增setPwd.html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改密码</title>
</head>
<body>
<form action="/auth/setPwd" method="post">
{% csrf_token %}
<table>
<tr>
<th>修改密码</th>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="{{ request.user }}" readonly></td>
</tr>
<tr>
<td>原密码:</td>
<td><input type="password" name="oldPwd" value="{{ oldPwd }}"></td>
</tr>
<tr>
<td>新密码:</td>
<td><input type="password" name="newPwd" value="{{ newPwd }}"></td>
</tr>
<tr>
<td>
<input type="submit" value="提交">
</td>
<td>
<font color="red">{{ errorInfo }}</font>
</td>
</tr>
</table>
</form>
</body>
</html>
结果:
原密码错误:
原密码正确:
5.4用户注销实现
用户注销通过auth.logout方法实现
用户登录后进入主页,显示注销功能;如果用户没登录,则显示登录功能;
views中实现Logout方法:
实现主页跳转方法to_index:
ulrs中添加映射:
修改index页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎
{% if request.user.is_authenticated %}
{{ request.user }}
<a href="/auth/logout">注销</a>
{% else %}
<a href="/tologin">登录</a>
{% endif %}
</body>
</html>
通过is_authenticated()方法可以判断用户是否登录认证
结果: