文章目录
管理员
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": "编辑用户"})
过程
- 设计数据库,添加编写在models.py,运行
- 设计url 添加到url,py里
- 在form.py 里面写class AdminModelForm 继承BootStrapModelForm
- 新建admin_list.html,修改<th,<td标签内容,<a标签链接
- 新建/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>