django web开发(七)管理员管理

管理员

edit ,add页面整合

由于add,edit页面内容:
1,展示的行数据,

 queryset = models.Admin.objects.filter(**data_dict)

2,分页

page_object = Pagination(request, queryset)
    context = {"search_data": search_data,
               "plist": page_object.page_queryset,
               "page_string": page_object.html(),
               }

3.edit特有的操作行数据

 pform = PEditModelForm(data=request.POST, instance=p_obj)
 /
 edform = Umodelform(data=request.POST, instance=u_obj)

都作为参数传入html中,

所以这add&edit页面对于用户,靓号,管理员通用,
于是整合了一下
xaddedit.html
其中 {% block css %},{% block js %} 中代码只对uadd有用

{% extends 'xlayout.html' %}
{% load static %}

{% block css %}
    <link rel="stylesheet" href="{% static 'jquery/bootstrap-datetimepicker-master/css/bootstrap-datetimepicker.min.css' %}">
{% endblock %}

{% block js %}
    <script src="{% static 'jquery/bootstrap-datetimepicker-master/js/bootstrap-datetimepicker.min.js' %}"></script>
    <script src="{% static 'jquery/bootstrap-datetimepicker-master/locale/bootstrap-datetimepicker.zh-CN.js' %}"></script>
    <script type="text/javascript">
        $(function () {
            //当容器加载完成,对容器调用工具函数
            $("#id_time").datetimepicker({
                language: 'zh-CN', //语言
                format: 'yyyy-mm-dd',//日期的格式
                minView: 'month', //可以选择的最小视图
                initialDate: new Date(),//初始化显示的日期
                autoclose: true,//设置选择完日期或者时间之后,日否自动关闭日历
                todayBtn: true,//设置自动显示为今天
                clearBtn: false//设置是否清空按钮,默认为false
            });
        });
    </script>

{% endblock %}
{% block mbname %}
    <div>
        <div class="container">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">{{ add_what }}</h3>
                </div>
                <div class="panel-body">
                    <div class="container">
                        <form class="form-horizontal" method="post" novalidate>
                            {% csrf_token %}

                            {% for field in form %}
                                <div class="form-group">
                                    <label class="col-sm-2 control-label">{{ field.label }}: </label>
                                    <div class="col-sm-8">
                                        {{ field }}
                                        {{ field.errors.0 }}
                                       {# 第一个错误信息#}
                                    </div>
                                </div>
                            {% endfor %}

                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="submit" class="btn btn-primary">提交</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>

        </div>
    </div>
{% endblock %}

调用时
在views各自函数中

    return render(request, 'xadddedit.html', {"form": edform, "title": "编辑用户"})

过程

  1. 设计数据库,添加编写在models.py,运行
  2. 设计url 添加到url,py里
  3. 在form.py 里面写class AdminModelForm 继承BootStrapModelForm
  4. 新建admin_list.html,修改<th,<td标签内容,<a标签链接
  5. 新建/views/admin.py,复制粘贴 ,然后改
  • 修改formmodel 为AdminModelForm,
  • 数据库名字为Admin
  • title
    齐活!

确认密码

全程在form里面操作
在form.py 修改AdminModelForm函数

在这里插入图片描述forms.py
写AdminModelForm

class AdminModelForm(BootStrapModelForm):
    confirm_password = forms.CharField(
        label="确认密码",
        # 密码输入框 输入显示为***
        widget=forms.PasswordInput()
    )

    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)
	
	#clean_confirm_password获得的pwd已经被加密
    def clean_confirm_password(self):
        confirm_password = md5(self.cleaned_data.get("confirm_password"))
        pwd = self.cleaned_data.get("password")
        if pwd != confirm_password:
            raise ValidationError("两次输入的密码不一致")
        return confirm_password

encry.py

# author : Sun;  time : 2023/2/9 16:57;
from django.conf import settings
import hashlib


def md5(data_string):
    obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8'))
    obj.update(data_string.encode('utf-8'))
    return obj.hexdigest()

重置密码

写form
在这里插入图片描述

from bm01.utils.form import AdminResetModelForm

在这里插入图片描述

全部代码

models

class Admin(models.Model):
    # 管理员表
    username = models.CharField(verbose_name="管理员名", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)
urls
    # 管理员管理
    path('admin/list/', admin.admin_list),
    path('adminadd/', admin.admin_add),
    path('admin/<int:dpid>/del', admin.admin_delete),
    path('admin/<int:epid>/edit', admin.admin_edit),
    path('admin/<int:epid>/reset', admin.admin_reset),
admin.py
# author : Sun;  time : 2023/2/9 1:06;
from django.shortcuts import render, redirect
from bm01 import models
from bm01.utils.pagination import Pagination
from bm01.utils.form import AdminModelForm, AdminResetModelForm


def admin_list(request):
    """靓号列表"""
    ##########搜索
    data_dict = {}
    search_data = request.GET.get('se', "")
    if search_data:
        data_dict = {"username__contains": search_data}
    queryset = models.Admin.objects.filter(**data_dict)
    ##########分页
    page_object = Pagination(request, queryset)
    context = {"search_data": search_data,
               "plist": page_object.page_queryset,
               "page_string": page_object.html(),
               }

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


def admin_add(request):
    title = "添加管理员"
    if request == "GET":
        pform = AdminModelForm()
        return render(request, 'xadddedit.html', {'form': pform, "title": title})
    admin_form = AdminModelForm(request.POST)
    if admin_form.is_valid():
        admin_form.save()
        return redirect("/admin/list/")
    return render(request, 'xadddedit.html', {'form': admin_form, "title": title})


def admin_edit(request, epid):
    title = "管理员编辑"
    p_obj = models.Admin.objects.filter(id=epid).first()
    if request.method == "GET":
        pform = AdminModelForm(instance=p_obj)
        return render(request, 'xadddedit.html', {'form': pform, 'title': title})
    pform = AdminModelForm(data=request.POST, instance=p_obj)
    if pform.is_valid():
        pform.save()
        return redirect("/admin/list/")
    return render(request, 'xadddedit.html', {'form': pform, 'title': title})


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


def admin_reset(request, epid):
    p_obj = models.Admin.objects.filter(id=epid).first()
    title = "{}重置密码".format(p_obj.username)
    if request.method == "GET":
        pform = AdminResetModelForm(instance=p_obj)
        return render(request, 'xadddedit.html', {'form': pform, 'title': title})
    pform = AdminResetModelForm(data=request.POST, instance=p_obj)
    if pform.is_valid():
        pform.save()
        return redirect("/admin/list/")
    return render(request, 'xadddedit.html', {'form': pform, 'title': title})

form.py
# author : Sun;  time : 2023/2/8 20:57;
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator  # 正则
from bm01 import models
from bm01.utils.bsmf import BootStrapModelForm
from bm01.utils.encrypt import md5


class AdminModelForm(BootStrapModelForm):
    confirm_password = forms.CharField(
        label="确认密码",
        # 密码输入框 输入显示为***
        widget=forms.PasswordInput()
    )

    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):
        confirm_password = md5(self.cleaned_data.get("confirm_password"))
        pwd = self.cleaned_data.get("password")
        if pwd != confirm_password:
            raise ValidationError("两次输入的密码不一致")
        return confirm_password


class AdminResetModelForm(BootStrapModelForm):
    confirm_password = forms.CharField(
        label="确认密码",
        widget=forms.PasswordInput()
    )

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

    def clean_password(self):
        pwd = md5(self.cleaned_data.get("password"))
        if pwd == md5(self.instance.password):
            raise ValidationError("新密码不能与旧密码相同")
        return pwd

    def clean_confirm_password(self):
        confirm_password = md5(self.cleaned_data.get("confirm_password"))
        pwd = self.cleaned_data.get("password")
        if pwd != confirm_password:
            raise ValidationError("两次输入的密码不一致")
        return confirm_password
admin_list.html
{% extends 'xlayout.html' %}

{% block mbname %}
    <div class="container">
        <div class="row cle" style="margin-bottom: 20px">
            <div class="col-xs-8">
                <a href="/padd/" type="button" class="btn btn-success">+添加靓号</a></div>
            <div class="col-xs-4">
                <form method="get">
                    <div class="input-group" >
                        <input class ="form-control"  name="se" type="text" placeholder="查找靓号" value="{{ search_data }}">
                        <span class="input-group-btn">
                            <button class="btn btn-default" type="submit">search number</button>
                        </span>
                    </div>
                </form>
            </div>
        </div>
        <div class="bs-example" data-example-id="panel-without-body-with-table">
            <div class="panel panel-default">
                <!-- Default panel contents -->
                <div class="panel-heading"><span class="glyphicon glyphicon-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>
                        <th>操作</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for i in plist %}
                        <tr>
                            <td>{{ i.id }}</td>
                            <td>{{ i.mobile }}</td>
                            <td>{{ i.price }}</td>
                            <td>{{ i.level }}</td>
                            <td>{{ i.status }}</td>

                            <td>

                                <a class="btn btn-primary btn-xs" href="/pretty/{{ i.id }}/edit">编辑</a>
                                <a class="btn btn-danger btn-xs" href="/pretty/{{ i.id }}/del">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>

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


{% endblock %}

xaddedit.html
{% extends 'xlayout.html' %}
{% load static %}

{% block css %}
    <link rel="stylesheet" href="{% static 'jquery/bootstrap-datetimepicker-master/css/bootstrap-datetimepicker.min.css' %}">
{% endblock %}

{% block js %}
    <script src="{% static 'jquery/bootstrap-datetimepicker-master/js/bootstrap-datetimepicker.min.js' %}"></script>
    <script src="{% static 'jquery/bootstrap-datetimepicker-master/locale/bootstrap-datetimepicker.zh-CN.js' %}"></script>
    <script type="text/javascript">
        $(function () {
            //当容器加载完成,对容器调用工具函数
            $("#id_time").datetimepicker({
                language: 'zh-CN', //语言
                format: 'yyyy-mm-dd',//日期的格式
                minView: 'month', //可以选择的最小视图
                initialDate: new Date(),//初始化显示的日期
                autoclose: true,//设置选择完日期或者时间之后,日否自动关闭日历
                todayBtn: true,//设置自动显示为今天
                clearBtn: false//设置是否清空按钮,默认为false
            });
        });
    </script>

{% endblock %}

{% block mbname %}
    <div>
        <div class="container">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">{{ title }}</h3>
                </div>
                <div class="panel-body">
                    <div class="container">
                        <form class="form-horizontal" method="post" novalidate>
                            {% csrf_token %}

                            {% for field in form %}
                                <div class="form-group">
                                    <label class="col-sm-2 control-label">{{ field.label }}: </label>
                                    <div class="col-sm-8">
                                        {{ field }}
                                        {{ field.errors.0 }}

                                    </div>
                                </div>
                            {% endfor %}

                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="submit" class="btn btn-primary">提交</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>

        </div>
    </div>
{% endblock %}

xlayout.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
    {% block css %}

    {% endblock %}
</head>
<body>
<nav class="navbar navbar-default">
    <div class="container">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                    data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">用户管理系统</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li class="active"><a href="/admin/list/">管理员管理 <span class="sr-only">(current)</span></a></li>
                <li class="active"><a href="/dlist/">部门管理 <span class="sr-only">(current)</span></a></li>
                <li class="active"><a href="/ulist/">员工管理 <span class="sr-only">(current)</span></a></li>
                <li class="active"><a href="/plist/">靓号管理 <span class="sr-only">(current)</span></a></li>
                <li><a href="#">模板独有</a></li>

            </ul>

            <ul class="nav navbar-nav navbar-right">
                <li><a href="#">登录</a></li>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                       aria-expanded="false">野猪沛齐 <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="#">个人信息</a></li>
                        <li><a href="#">Another action</a></li>
                        <li><a href="#">Something else here</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="#">Separated link</a></li>
                    </ul>
                </li>
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>
<div>

    {% block mbname %}

    {% endblock %}
</div>
<script src="{% static 'js/jquery-3.4.1.js' %}"></script>
<script src="{% static 'plugins/bootstrap/js/bootstrap.js' %}"></script>
{% block js %}

{% endblock %}
</body>
</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值