Django 框架添加管理员,完成对普通用户信息管理

前情回顾:Django框架 完成用户登录注册

文章目录

    • 1.创建管理员
    • 2.完善管理员功能
      • 2.1增加管理员登录功能
      • 2.2完善展示用户信息功能
      • 2.3完善修改用户信息功能
      • 2.4完善删除用户信息功能

1.创建管理员

一般管理员都是直接指定,不开放页面注册,可以直接手动在数据库添加,Django框架提供了方法,让我们直接创建管理员,步骤如下:

  1. 打开pycharm下面的命令行终端
  2. 输入命令
python manage.py createsuperuser
  1. 按照提示进行输入信息
    在这里插入图片描述
    打开数据库,可以看出,已经帮我们插入了管理员的信息
    在这里插入图片描述
    同时Django也提供了管理员登录页面,http://127.0.0.1:8000/admin/
    这里不使用框架自带的页面,修改已经写好的用户登录页面,当做管理员登录页面。

2.完善管理员功能

2.1增加管理员登录功能

新建管理员视图,这里笔者命名为admin_controller.py,增添登录功能,与用户登录功能唯一不同的是增加了一个字段校验,判断是不是个管理员,判断成功才能登录。

  1. 添加登录方法,登录成功后跳转到用户管理页面
def admin_login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username and password:# 进行身份验证 增加一条校验user = authenticate(username=username, password=password, is_superuser=1)if user is not None:# 管理员验证成功, 自动重定向用户管理return redirect('/user_list')else:return HttpResponse('无效的凭据')else:return HttpResponseBadRequest('请提供读者ID和密码')return render(request, 'admin_login.html')  # 渲染 user_login.html 模板
  1. 添加模板 admin_login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Login</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;}.login-container {background-color: #fff;padding: 20px;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);width: 400px; /* 修改宽度 */height: 400px;margin: 20px; /* 添加外边距 */}.login-container h2 {text-align: center;}.login-container form {display: flex;flex-direction: column;}.login-container form input[type="text"],.login-container form input[type="password"] {margin-bottom: 15px;padding: 10px;margin-top: 10%;border-radius: 4px;border: 1px solid #ccc;font-size: 16px;}.login-container form input[type="submit"] {margin-top: 20%;background-color: #007bff;color: #fff;border: none;padding: 10px;border-radius: 4px;cursor: pointer;font-size: 16px;transition: background-color 0.3s ease;}.login-container form input[type="submit"]:hover {background-color: #0056b3;}</style>
</head>
<body><div class="login-container"><h2>管理员登录</h2><form  method="post">{% csrf_token %}<input type="text" name="username" placeholder="Username" required><input type="password" name="password" placeholder="Password" required><input type="submit" value="Login"></form></div>
</body>
</html>
  1. 配置url
    在urls.py增加路径
from django.urls import path
from . import reader_controller
from . import admin_Controller
urlpatterns = [path('admin/', admin_Controller.admin_login),path('login/', reader_controller.reader_login, name='reader_login'),path('signup/', reader_controller.signup, name='reader_signup'),
]

2.2完善展示用户信息功能

  1. 在视图增加查询所有用户信息函数 ,使用filter过滤信息
def get_all_reader(request):# 查询不包括管理员的所有用户normal_users = User.objects.filter(is_staff=False)return render(request, 'user_list.html', {'users': normal_users})
  1. 返回给模板页面
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>管理菜单</title><style>/* 菜单样式 */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}.sidebar {width: 250px;background-color: #333;height: 100%;position: fixed;left: 0;top: 0;overflow-x: hidden;{#padding-top: 20px;#}}.sidebar a {padding: 10px 16px;margin: 20px;text-decoration: none;font-size: 22px;color: #85f112;display: block;transition: 0.3s;}.sidebar a:hover {background-color: #0edcac;color: black;}.content {margin-left: 250px;padding: 20px;}.header {background-color: #f1f1f1;padding: 10px;text-align: center;}{#    美化表格#}table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid #ddd;padding: 8px;text-align: left;}th {background-color: #f2f2f2;}tr:nth-child(even) {background-color: #f9f9f9;}</style>
</head>
<body><div class="sidebar"><div class="header"><h2>管理菜单</h2></div><a href="#">用户管理</a><a href="#">图书管理</a><a href="#">借阅管理</a><a href="#">数据库日志</a>
</div><div class="content"><!-- 这里是你的主要内容 --><h2>用户列表</h2><table><tr><th>编号</th><th>用户名</th><th>邮箱</th><th>注册时间</th><th>操作</th><!-- 这里可以根据需要显示其他字段 --></tr>{% for user in users %}<tr><td>{{ user.id }}</td><td>{{ user.username }}</td><td>{{ user.email }}</td><td>{{ user.date_joined }}</td><td>
{#                注意这里路径写法#}<a href="../users/{{ user.id }}/edit/">修改</a> | <a href="../delete_user/{{ user.id }}/">删除</a></td><!-- 这里可以根据需要显示其他字段 --></tr>{% endfor %}</table>
</div></body>
</html>
  1. 绑定URL
 path('user_list/', admin_Controller.get_all_reader),

效果如图:
在这里插入图片描述

2.3完善修改用户信息功能

完成修改用户信息,分为两步:1,获取到用户信息 并回显到页面 2,提交新的信息到后台

  1. 添加查询用户信息函数
def get_reader_by_id(request, id):# 用户编号 查询数据reader = User.objects.filter(id=id).first()return render(request, 'user_edit.html', {'user': reader})
  1. 添加用户编辑页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>修改用户信息</title><style>body {font-family: Arial, sans-serif;margin: 0;padding: 20px;background-color: #f7f7f7;}form {max-width: 400px;margin: 0 auto;background-color: #fff;padding: 20px;border-radius: 5px;box-shadow: 0 0 10px rgba(0,0,0,0.1);}label {display: block;margin-bottom: 5px;font-weight: bold;}input[type="text"],input[type="password"],input[type="email"] {width: 100%;padding: 8px;margin-bottom: 10px;border: 1px solid #ccc;border-radius: 3px;}button {padding: 10px 20px;border: none;border-radius: 3px;background-color: #4caf50;color: white;cursor: pointer;}button:hover {background-color: #45a049;}</style>
</head>
<body><form method="post" action="/change_user_password/">{% csrf_token %}<input type="hidden" name="user_id" value="{{ user.id }}"><label for="username">用户名:</label><input type="text" id="username" name="username" value="{{ user.username }}" readonly><br><br><label for="password">新密码:</label><input type="password" id="password" name="password" ><br><br><label for="email">邮箱:</label><input type="email" id="email" name="email" value="{{ user.email }}"><br><br><button type="submit">修改</button></form>
</body>
</html>
  1. 绑定URL,因为需要ID查询用户信息,因此路径中应该添加int参数
  path('users/<int:id>/edit/', admin_Controller.get_reader_by_id, name='user_edit'),

效果如图
在这里插入图片描述
接下来将表单提交到用户信息修改函数
因为密码存在到数据库的时候,进行了加密处理,因为Django提供了一个修改密码的方法,set_password

def change_user_password(request):if request.method == 'POST':try:username = request.POST.get('username')new_password = request.POST.get('password')print(new_password)new_email = request.POST.get('email')user = User.objects.get(username=username)if new_password:user.set_password(new_password)if new_email:user.email = new_emailif new_password or new_email:user.save()return redirect('/user_list')  # 密码和邮箱已成功修改或更新except User.DoesNotExist:return HttpResponse('用户不存在')  # 用户不存在,重定向到错误页面或其他适当的处理return HttpResponseBadRequest('不允许的请求')  # 非 POST 请求,重定向到其他处理页面

绑定URL

  path('change_user_password/', admin_Controller.change_user_password),

2.4完善删除用户信息功能

类似于查询用户信息,都需要提供一个ID

def del_user(request, id):try:user = User.objects.get(id=id)user.delete()return redirect('/user_list')# 重定向到用户页面except User.DoesNotExist:return HttpResponse('用户不存在')

删除成功之后,直接跳转用户信息管理页面
最后附上urls.py

from django.urls import path
from . import reader_controller
from . import admin_Controller
urlpatterns = [path('admin/', admin_Controller.admin_login),path('login/', reader_controller.reader_login, name='reader_login'),path('signup/', reader_controller.signup, name='reader_signup'),path('user_list/', admin_Controller.get_all_reader),path('users/<int:id>/edit/', admin_Controller.get_reader_by_id, name='user_edit'),path('change_user_password/', admin_Controller.change_user_password),path('delete_user/<int:id>/', admin_Controller.del_user, name='delete_user'),
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/337632.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库系统概论】期末复习1

试述数据、数据库、数据库系统、数据库管理系统的概念。试述文件系统与数据库系统的区别和联系。试述数据库系统的特点。数据库管理系统的主要功能有哪些&#xff1f;试述数据库系统三级模式结构&#xff0c;这种结构的优点是什么&#xff1f;什么叫数据与程序的物理独立性&…

2024-01-03 无重叠区间

435. 无重叠区间 思路&#xff1a;和最少数量引爆气球的箭的思路基本都是一致了&#xff01;贪心就是比较左边的值是否大于下一个右边的值 class Solution:def eraseOverlapIntervals(self, points: List[List[int]]) -> int:points.sort(keylambda x: (x[0], x[1]))# 比较…

基于JAVA+SpringBoot的高校学术报告系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 智慧高校学术报告系统…

系统添加深色模式实现方案

业务需求,夜间看系统太刺眼,要求添加夜间模式 效果如下: 依赖如下: 参考了官方解决方案,尝试后没有有效的解决. 官方解决方案 后续打算换框架,发现antdesign pro vue版本的暗黑模式禁用了. ant design pro 预览地址 思路: 引入andesign 暗黑模式的样式 , 手动修改自定义类…

VLAN原理与配置

0x00 前言 本节主要记录VLAN相关的内容。 传统以太网的缺点 广播域越大&#xff0c;产生的网络安全问题&#xff0c;垃圾流量问题越严重。 什么是VLAN&#xff1f; Virtual Local Area NetWork 虚拟局域网技术。 VLAN的特点是什么 一个VLAN就是一个广播域&#xff0c;在…

AWS CodeCommit创建git库

问题 在AWS云国际站上面使用CodeCommit服务创建git代码库。这里假设本地已经安装好git&#xff0c;ssh等工具&#xff0c;并且本地已经创建好相关公私钥文件&#xff0c;熟悉git和ssh通用配置文件&#xff0c;这里不会介绍windows和pc上面的ssh和git配置文件差异&#xff0c;需…

RocketMQ 消费重试

消费者出现异常&#xff0c;消费某条消息失败时&#xff0c; Apache RocketMQ 会根据消费重试策略重新投递该消息进行故障恢复。本文介绍消费重试机制的原理、版本兼容性和使用建议。 一、应用场景​ Apache RocketMQ 的消费重试主要解决的是业务处理逻辑失败导致的消费完整性…

内裤洗衣机有用吗?五款小型洗衣机全自动推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

ubuntu查看内存使用情况命令

命令简介 在Ubuntu系统中&#xff0c;可以使用终端命令来查看电脑的内存使用情况。打开终端并输入以下命令&#xff1a; free -h 该命令可用于查看系统中内存的总量、已使用的内存、空闲的内存及缓冲区使用的内存。其中“-h”选项用于以人类可读的格式显示内存大小。执行该命…

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO BIO、NIO、AIO特点和场景 BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;、AIO&#xff08;Asynchronous I/O&#xff09;是Java中用于处理I/O操作的三种不同的I/O模型&#xff0c;它们具…

云卷云舒:kubernetes简介

Kubernetes是由google公司在2014年发布的一款开源的容器编排引擎&#xff0c;用于容器化应用程序的自动化部署、扩展与管理。它能够编排多种容器任务&#xff0c;涵盖虚拟机集群管理、负载均衡以及网络流量分配等等。2017年&#xff0c;aws、微软云、阿里云等等著名的云计算公司…

Page 251~254 Win32 GUI项目

win32_gui 源代码&#xff1a; #if defined(UNICODE) && !defined(_UNICODE)#define _UNICODE #elif defined(_UNICODE) && !defined(UNICODE)#define UNICODE #endif#include <tchar.h> #include <windows.h>/* Declare Windows procedure */…