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

news2025/1/11 18:34:43

前情回顾: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_email

            if 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.coloradmin.cn/o/1373366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读1---OpenCalib论文阅读之factory calibration模块

前言 该论文的标定间比较高端&#xff0c;一旦四轮定位后&#xff0c;可确定标定板与车辆姿态。以下为本人理解&#xff0c;仅供参考。 工厂标定&#xff0c;可理解为车辆相关的标定&#xff0c;不涉及传感器间标定 该标定工具不依赖opencv&#xff1b;产线长度一般2.5米 Fa…

羌族特色民居----碉楼

羌族是四川的一个少数民族&#xff0c;他们独具特色的民居就是----碉楼。在羌语中&#xff0c;碉楼被称为“邓笼”&#xff0c;意为美丽、高贵的房子&#xff0c;羌族人有“依山而居&#xff0c;垒石为屋&#xff0c;高者十余丈”的习俗。碉楼的高度在十米至三十米之间。用于御…

基于Java的 人才管理系统的设计与实现

当前企业人才招揽的方式更多是通过传统的线下招聘会或职业介绍所来实现的&#xff0c;其不但受众具有很大的局限性&#xff0c;而且往往不可能在短时间内招聘的需要的人才。而互联网的普及为企业人才招聘和管理的方式带来了翻天覆地的改变。通过互联网将人才信息统一管理起来成…

【sklearn练习】模型评估

一、交叉验证 cross_val_score 的使用 1、不用交叉验证的情况&#xff1a; from __future__ import print_function from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifieriris…

Abp 创建一个模版demo并运行

Demo效果 &#xff1a;简单的单表crud后台服务。不包含UI 项目类型是模块ABP。生成的结构和 多应用/单应用 有差异。 结合文档以及git的源码分享一下demo的理解 abp文档&#xff1a;API/Auto API Controllers | Documentation Center | ABP.IO 前置准备&#xff1a; Net8 环境…

【Linux】Linux系统编程——Linux目录结构

Linux的文件系统呈现为一种树状结构&#xff0c;以根目录/为最顶层&#xff0c;其下分布着各种不同的子目录&#xff0c;每个目录都有其特定的用途和功能。下面是Linux目录结构的详细介绍&#xff1a; 1. 根目录 / 根目录是整个文件系统的基础。所有的目录和文件都从这里开始…

智能制造与MES:推动制造业转型升级的关键

随着科技的迅猛发展&#xff0c;智能制造已经成为推动制造业转型升级的重要手段。而制造执行系统&#xff08;MES&#xff09;作为智能制造的核心管理系统&#xff0c;在提高生产效率、优化生产流程、实现数字化转型等方面发挥着重要作用。 一、智能制造的概念与特点 智能制造…

极狐 GitLab 冷知识:使用 Email 也可以创建 Issue?

前言 在使用 GitLab 时&#xff0c;创建 Issue 和 Merge Request 的方法&#xff0c;除了常规的使用 GitLab Web UI 进行操作和通过 API 调用操作&#xff0c;还有一些比较好玩的&#xff0c;比如使用 Email 来创建。 Incoming email 如果是 Self-Manager 的 GitLab 用户&am…

少儿编程 2023年12月中国电子学会图形化编程等级考试Scratch编程三级真题解析(判断题)

2023年12月scratch编程等级考试三级真题 判断题 19、下列两段程序的运行效果相同 答案:对 考点分析:考查积木综合使用,重点考查循环积木的使用;左边属于有条件的循环,由变量的值控制,当变量值大于50时,循环停止,而变量始终为零,不满足条件,所以一直循环,和右边的…

市场复盘总结 20240110

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 33% 二进三&#xff1a; 进级率低 50% 最常用的二种方法&#xff1a; 方法一&…

观成科技-加密C2框架EvilOSX流量分析

工具简介 EvilOSX是一款开源的&#xff0c;由python编写专门为macOS系统设计的C2工具&#xff0c;该工具可以利用自身释放的木马来实现一系列集成功能&#xff0c;如键盘记录、文件捕获、浏览器历史记录爬取、截屏等。EvilOSX主要使用HTTP协议进行通信&#xff0c;通信内容为特…

Android可换行的RadioGroup

Android可换行的RadioGroup,有时候需要换行显示的单选列表&#xff0c;当然可以有多种实现方式&#xff0c;比如recycleview或者listview实现&#xff0c;本文采用的是RadioGrouprediobutton方式实现。 一、首先自定义view public class WrapRadioGroup extends RadioGroup {pr…

领域专家精心讲解AI视频生成

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

PPT插件-大珩助手-快速构建自己的图形

绘图板-快速构建自己的图形 通过手绘的方式&#xff0c;快速构建自己的想法和创意&#xff0c;通过在PPT中插入绘图&#xff0c;植入背景透明的绘图&#xff0c;点击画笔可切换橡皮擦&#xff0c;可以清空画板重新绘制。 素材库-存储图形 通过素材库存储自己的图形 图形调整…

【Emgu.CV教程】4.4、无缝融合应用之TextureFlattening()纹理扁平化

这是无缝融合应用的最后一篇&#xff0c;TextureFlattening()函数&#xff0c;专门用于对图像指定部位进行纹理扁平化的。这个功能现在讲起来有点太早了&#xff0c;应该放到《图像的空间滤波--平滑》这一章节中才合适。因为它就是用Sobel算子进行平滑&#xff0c;也就是在保留…

uniapp使用wxml-to-canvas开发小程序保存canvas图片

微信小程序官方解决方案&#xff1a;wxml-to-canvas 使用wxml-to-canvas要知道一些前提条件 1、只能画view&#xff0c;text&#xff0c;image 2、每个元素必须要设置宽高 3、默认是flex布局&#xff0c;可以通过flexDirection: "column"来改变排列方式 4、文字 必…

复试 || 就业day14(2024.01.10)算法篇

文章目录 前言字符串中第二大的数字字符串中不同整数的数目判断句子是否为全字母句长度为三且各字符不同的子字符串检查是否区域内所有整数都被覆盖*重新分配字符使所有字符串都相等可以输入的最大单词数检查是否所有字符出现次数相同差的绝对值为 K 的数对数目至少在两个数组中…

PHP开发日志 ━━ php8.3安装与使用组件Xdebug

今天开头写点历史&#xff1a; 二十年前流行asp&#xff0c;当时用vb整合常用函数库写了一个dll给asp调用&#xff0c;并在此基础上开发一套仿windows界面的后台管理系统&#xff1b;后来asp逐渐没落&#xff0c;于是在十多年前转投php&#xff0c;不久后用php写了一套mvc框架&…

压缩编码之变换的选择之离散余弦变换(DCT)和离散傅立叶变换(DFT)——数字图像处理

原理 变换的选择是一个关键的考量因素&#xff0c;它决定了数据是如何被压缩的。选择变换时考虑以下几个重要原则&#xff1a; 数据去关联性&#xff1a;变换的目的之一是减少数据中的相关性。例如&#xff0c;在图像压缩中&#xff0c;像素间往往高度相关。通过适当的变换&a…