首页 > 其他分享 > 11-管理员列表

11-管理员列表

时间:2022-12-07 16:48:22浏览次数:43  
标签:11 return form admin request 列表 管理员 password data

1. 数据库新建库-app[models.py]
from django.db import models


class Admin(models.Model):
    """管理员表"""
    username = models.CharField(verbose_name="用户名", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)
2. 执行命令生成数据库表
# 在mysql中生成表
    '''
    1. 工具连接mysql生成数据库 
        create database 库名 default charset utf8 collate utf8_general_ci;
    
    2. django 中修改配置文件,连接Mysql
    
    3. django命令生成数据库表
        python manage.py makemigrations
        python manage.py migrate
    '''
3. 创建url,链接视图函数,项目[url.py]
# 管理员管理
    path('admin/list/', admin.admin_list),
    path('admin/add/', admin.admin_add),
    path('admin/<int:nid>/update/', admin.admin_update),
    path('admin/<int:nid>/delete/', admin.admin_delete),
    path('admin/<int:nid>/reset/', admin.admin_reset),
4. 创建md5加密方法app[utils][encrypt.py]
from bbc_auto import settings
# setting中有默认的随机生成的言
import hashlib


def md5(data_string):
    # salt = "xxxxx"  # 因为加密方式是固定的,所以加个言
    # obj = hashlib.md5(salt.encode("utf-8"))
    obj = hashlib.md5(settings.SECRET_KEY.encode("utf-8"))
    obj.update(data_string.encode("utf-8"))
    return obj.hexdigest()

5. 创建视图函数.app[views][admin.py]
# 模块导入,先写内置-第三方-自定义

from django.shortcuts import render, redirect
from django.core.exceptions import ValidationError

from app01 import models
from app01.utils.pagemtion import Pagination
from app01.utils.encrypt import md5


def admin_list(request):
    """管理员列表"""
    # 构造搜索
    data_dict = {}
    search_data = request.GET.get("q", "")  # 有值的话拿值,没值空字符串
    if search_data:
        data_dict["username__contains"] = search_data

    # 根据搜索条件去数据库获取
    querty = models.Admin.objects.filter(**data_dict)

    # 分页
    page_object = Pagination(request, querty)
    context = {
        "querty": page_object.page_queryset,
        "page_string": page_object.html(),
        "search_data": search_data
    }

    return render(request, "admin_list.html", context)


from app01.utils.bootstrap import BootStrapModelForm
from django import forms


class AdminModelForm(BootStrapModelForm):
    # 添加一个确认密码的输入框,这个字段在数据库中是没有的
    confirm_password = forms.CharField(label="确认密码",
                                       # render_value=True:点击确认后不清空密码
                                       widget=forms.PasswordInput(render_value=True),  # render_value=True 定义密码保密显示
                                       )

    class Meta:
        model = models.Admin
        fields = ["username", "password", "confirm_password"]
        widgets = {
            "password": forms.PasswordInput(render_value=True)
        }

    def clean_password(self):  # 获取密码加密
        pwd = self.cleaned_data.get("password")
        return md5(pwd)

    def clean_confirm_password(self):  # 钩子方法: 获取密码和确认密码
        # print(self.cleaned_data)  # (self.cleaned_data)  # 验证通过后,里面所有的内容
        pwd = self.cleaned_data.get("password")  # 此时获取的pwd就是加完秘的
        confirm = md5(self.cleaned_data.get("confirm_password"))
        if confirm != pwd:
            raise ValidationError("密码不一致")

        return confirm  # return 返回的什么保存到数据库的值就是什么


def admin_add(request):
    """添加管理员"""
    title = "新建管理员"
    if request.method == "GET":
        form = AdminModelForm()
        return render(request, "change.html", {"form": form, "title": title})

    form = AdminModelForm(data=request.POST)
    if form.is_valid():
        # {'username': 'admin', 'password': '123', 'confirm_password': '321'}
        # print(form.cleaned_data)  # 验证通过后,里面所有的内容

        form.save()
        return redirect("/admin/list/")
    return render(request, "change.html", {"form": form, "title": title})  # 如果有错误的话会自动效验


class AdminUpdate(BootStrapModelForm):
    class Meta:
        model = models.Admin
        fields = ["username"]


def admin_update(request, nid):
    """编辑"""

    # 判断路径中的nid是否正确  对象 / none
    row_object = models.Admin.objects.filter(id=nid).first()
    if not row_object:
        # 方式一: 写一个提示错误的页面
        # return render(request, 'error.html', {"msg": "数据不存在"})

        # 方式二: 跳转回首页
        return redirect('/admin/list/')
    title = "编辑管理员"

    if request.method == "GET":
        form = AdminUpdate(instance=row_object)  # instance=row_object:显示默认值
        return render(request, "change.html", {"form": form, "title": title})  # 如果有错误的话会自动效验

    form = AdminUpdate(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/admin/list/')
    return render(request, "change.html", {"form": form, "title": title})  # 如果有错误的话会自动效验


def admin_delete(request, nid):
    """删除"""
    models.Admin.objects.filter(id=nid).delete()
    return redirect('/admin/list/')


class AdminReset(BootStrapModelForm):
    # 添加一个确认密码的输入框,这个字段在数据库中是没有的
    confirm_password = forms.CharField(label="确认密码",
                                       # render_value=True:点击确认后不清空密码
                                       widget=forms.PasswordInput(render_value=True),  # 定义密码保密显示
                                       )

    class Meta:
        model = models.Admin
        fields = ["password", "confirm_password"]
        widgets = {
            "password": forms.PasswordInput(render_value=True)
        }

    def clean_password(self):  # 获取密码加密
        pwd = self.cleaned_data.get("password")
        md5_pwd = md5(pwd)

        # 去数据库效验当前密码和新输入的密码是否一致
        # self.instance就是下面代码中传入的对象 .pk:就是路径中的id
        exists = models.Admin.objects.filter(id=self.instance.pk, password=md5_pwd).exists()
        print(exists)
        if exists:
            raise ValidationError("密码不能与之前相同")
        return md5_pwd

    def clean_confirm_password(self):  # 钩子方法: 获取密码和确认密码
        # print(self.cleaned_data)  # (self.cleaned_data)  # 验证通过后,里面所有的内容
        pwd = self.cleaned_data.get("password")  # 此时获取的pwd就是加完秘的
        confirm = md5(self.cleaned_data.get("confirm_password"))
        from django.core.exceptions import ValidationError
        if confirm != pwd:
            raise ValidationError("密码不一致")

        return confirm  # return 返回的什么保存到数据库的值就是什么


def admin_reset(request, nid):
    """重置密码"""
    row_object = models.Admin.objects.filter(id=nid).first()
    if not row_object:
        return redirect('/admin/list/')

    title = "重置密码-{}".format(row_object.username)

    if request.method == "GET":
        form = AdminReset()
        return render(request, "change.html", {"form": form, "title": title})  # 如果有错误的话会自动效验

    form = AdminReset(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/admin/list/')
    return render(request, "change.html", {"form": form, "title": title})  # 如果有错误的话会自动效验

6. 创建列表html,app[templates][admin_list.html]
{% extends 'one.html'%}

{% block content %}
<div class="container">
    <div style="margin-bottom:10px;" class="clearfix">
        <a class="btn btn-success" href="/admin/add/">
            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
            新建管理员</a>

        <div style="float:right;width:300px;">
            <form method="get">
                <div class="input-group">

                    <input type="text" name="q" class="form-control" placeholder="关键字"
                           value="{{ search_data }}">
                    <span class="input-group-btn">
                    <button class="btn btn-default" type="submit">
                        <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                    </button>
                  </span>

                </div>
            </form>
        </div>

        <a class="btn btn-success" href="/phone/add/">
            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
            新建手机号ModelForm</a>
    </div>

    <div class="panel panel-default">
        <!-- Default panel contents -->
        <div class="panel-heading">
            <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
            管理员列表
        </div>

        <!-- Table -->
        <table class="table table-bordered">
            <thead>
            <tr>
                <th>ID</th>
                <th>用户名</th>
                <th>密码</th>
                <th>重置密码</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody>
            {% for obj in querty %}
            <tr>
                <th>{{ obj.id }}</th>
                <th>{{ obj.username }}</th>
                <th>*******</th>
                <td>
                    <a href="/admin/{{ obj.id }}/reset/">重置密码</a>
                </td>
                <td>
                    <a class="btn btn-primary btn-xs" href="/admin/{{obj.id}}/update/">编辑</a>
                    <a class="btn btn-danger btn-xs" href="/admin/{{obj.id}}/delete/">删除</a>
                </td>
            </tr>
            {% endfor %}

            </tbody>
        </table>
    </div>

    <ul class="pagination">
        {{ page_string }}
    </ul>

</div>

{% endblock %}

7. 创建添加html,app[templates][change.html]
{% extends 'one.html' %}

{% block content %}

<div class="container">
    <div class="panel panel-default">
        <div class="panel-heading">
            <h3 class="panel-title">{{ title }}</h3>
        </div>
        <div class="panel-body">
            <!--            novalidate: 关掉浏览器的校验-->
            <form method="post" novalidate>
                {% csrf_token %}

                {% for field in form %}
                <div class="form-group">
                    <label>{{ field.label }}</label>
                    <!--                    <input type="text" class="form-control" placeholder="姓名" name="user">-->
                    {{ field }}
                    <span style="color:red;"> {{ field.errors.0 }}</span>
                </div>
                {% endfor %}

                <button type="submit" class="btn btn-primary">提 交</button>
            </form>
        </div>
    </div>
</div>

{% endblock %}


8. 创建修改html,app[templates][change.html],添加和修改页面一样,使用同一个页面即可
9. 删除可直接根据nid删除,不需要html页面
10 . 重置密码页面也一样,可以复用app[templates][change.html]

标签:11,return,form,admin,request,列表,管理员,password,data
From: https://www.cnblogs.com/kh-1314/p/16963515.html

相关文章

  • Kotlin学习快速入门(11)—— 枚举类的使用
    原文地址:Kotlin学习快速入门(11)——枚举类的使用-Stars-One的杂货小窝由于有时候偶尔用到枚举类,所以简单记录一下,和Java的一起对比记录下面以一个简单的四季设计一个枚......
  • 【ARXIV2211】Efficient multi-order gated aggregation network
    作者认为,交互复杂性是视觉识别一个重要特点。为此,作者通过复杂特征交互构建了一个纯卷积的网络MogaNet用于图像识别。MogaNet的整体框架如下图所示,架构和一般的Transfo......
  • 前端学习之------树形列表转list
    1、树形数据为:2、方法letresult=[]//结果数组lettreeToList=(treeArr)=>{treeArr.forEach(treeitem=>{result.push({id:treeitem.i......
  • C++11 STL 完美转发
    http://m.biancheng.net/view/7868.htmlC++11标准为C++引入右值引用语法的同时,还解决了一个C++98/03标准长期存在的短板,即使用简单的方式即可在函数模板中实现参数......
  • 直播app系统源码,使用scroll-view实现内容列表的竖向滚动
    直播app系统源码,使用scroll-view实现内容列表的竖向滚动app.json{ "pages":[  "pages/index/index" ], "window":{  "navigationBarBackgroundColor":"......
  • 如何在Windows Server 2016上重置用户“管理员”的密码
    方法来自如何在WindowsServer2016上重置用户“管理员”的密码-AleAdmin.it如果您忘记了装有WindowsServer2016(物理或虚拟)的服务器上的本地管理员密码,则可以从操作......
  • 1118及之后的单片机学习记录
    1.枚举类型是一种基本数据类型,其中一个枚举成员所占大小4个字节;对枚举变量的赋值只能通过将一个值强制类型转换为它本身的枚举成员然后进行赋值(不可以对枚举成员赋值,不可......
  • jenkins忘记管理员密码
    一、admin密码未更改情况1.进入​​/root/.jenkins/secrets/​​目录,打开initialAdminPassword文件,复制密码;2.访问Jenkins页面,输入管理员admin,及刚才的密码;3.进入后可更改......
  • 疫情期间刷题列表
    图的连通性P3388【模板】割点(割顶)[道路建设POJ3352](缩点模版)P3387【模板】缩点KMP【模板】KMP字符串匹配剪花布条HDU-2087优先队列P1168中位数链式前向星P......
  • DCDC直流隔离升压12V24V48V转600V800V1100V2500V3000V高压稳压输出电源模块
    特点●效率高达 80%●2*2英寸标准封装●单双电压输出●价格低●大于600V高压,稳压输出●工作温度:-40℃~+85℃●阻燃封装,满足UL94-V0要求●温度特性好●可直接......