1、构建数据表
class Admin(models.Model):
username=models.CharField(verbose_name="用户名",max_length=32)
password=models.CharField(verbose_name="密码",max_length=64)
2、url路径
path('admain/list/',admain.admain_list),
path("admain/add/",admain.admain_add),
path('admain/<int:nid>/edit/',admain.admain_edit),
path('admain/<int:nid>/delete/',admain.admain_delete)
3、html页面(显示)
{% extends 'header.html' %}
{% block css %}
{% endblock %}
{% block content %}
<div>
<div class="container">
<div style="margin-bottom: 10px">
<a class="btn btn-success" href="/admain/add" target="_blank">
{# 加号图标#}
<span class="glyphicon glyphicon-plus-sign" 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><!-- /input-group -->
</form>
</div>
</div>
<div class="panel panel-default">
<div class="panel-body">
<span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
管理员列表
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>用户名</th>
<th>密码</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in queryset %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.username }}</td>
<td>*******</td>
<td>
<a class="btn btn-primary btn-xs" href="/admain/{{ obj.id }}/edit/">编辑</a>
<a class="btn btn-danger btn-xs" href="/admain/{{ obj.id }}/delete/">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<ul class="pagination" style="margin:auto auto; position:fixed; top:620px;left: 100px">
{{ page_string }}
</ul>
</div>
{% endblock %}
{% block js %}
{% endblock %}
</body>
</html>
4、html页面(编辑增加)
{% extends 'header.html' %}
{% block content %}
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-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>
{{ field }}
<span style="color: red">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
5、类的创建
# modelform实例
from app01 import models
# 格式错误时显示的样式
from django.core.exceptions import ValidationError
# 分页组件
# 应用bootstrap样式
from app01.utils.bootstrap import BootStrapModelForm
from django import forms
from app01.utils.encrypt import md5
class UserModelForm(BootStrapModelForm):
class Meta:
model = models.UserInfo
fields = ["name", "password", "age", "account", "create_time", "gender", "depart"]
# 使用插件,应用样式
# widgets={
# "name":forms.TextInput(attrs={"class":"form-control"}),
# "password": forms.PasswordInput(attrs={"class": "form-control"}),
# }
class PrettyModelForm(BootStrapModelForm):
# 号码不可以被修改
# mobile=forms.CharField(disabled=True,label="手机号")
# 验证方法一 对号码格式进行限制
# mobile=forms.CharField(
# label="手机号",
# validators=[RegexValidator(r'^1[3-9]\d{9}$','手机号格试错误'),],
# )
class Meta:
model = models.PrettyNum
fields = ["mobile", 'price', 'level', 'status']
# def __init__(self, *args, **kwargs):
# super().__init__(*args, **kwargs)
# for name, field in self.fields.items():
# field.widget.attrs = {"class": "form-control", "placeholder": field.label}
# 验证方法二
def clean_mobile(self):
txt_mobile = self.cleaned_data["mobile"]
# 存在TRUE不存在False
exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
if exists:
raise ValidationError("该手机号已经存在")
if len(txt_mobile) != 11:
raise ValidationError("格式错误")
return txt_mobile
class PrettyEditModelForm(BootStrapModelForm):
# 不能修改手机号
# mobile=forms.CharField(disabled=True,label="手机号")
class Meta:
model = models.PrettyNum
fields = ['mobile', 'price', 'level', 'status']
# def __init__(self, *args, **kwargs):
# super().__init__(*args, **kwargs)
# for name, field in self.fields.items():
# field.widget.attrs = {"class": "form-control", "placeholder": field.label}
# 验证方法二
def clean_mobile(self):
txt_mobile = self.cleaned_data["mobile"]
# 存在TRUE不存在False
# 去掉本个记录,查找是否有其他手机号相同的记录
exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()
if exists:
raise ValidationError("该手机号已经存在")
if len(txt_mobile) != 11:
raise ValidationError("格式错误")
return txt_mobile
class AdmainModeForm(BootStrapModelForm):
confirm_password=forms.CharField(
label="确认密码",
# 不删除里面的内容
widget=forms.PasswordInput(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):
pwd=self.cleaned_data.get("password")
confirm=md5(self.cleaned_data.get("confirm_password"))
if confirm != pwd:
raise ValidationError("密码不一致")
return confirm
class AdmainEditModeForm(BootStrapModelForm):
class Meta:
model=models.Admin
fields=['username']
6、密码加密方式
# 密码加密
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()
7、函数的书写
from django.shortcuts import render,redirect
from app01 import models
from app01.utils.pagination import Pagination
from app01.utils.form import AdmainModeForm,AdmainEditModeForm
def admain_list(request):
# models.Admin.objects.create(username="lisan",password="1111")
data_dict = {}
search_data = request.GET.get('q', "")
if search_data:
data_dict["username__contains"] = search_data
# prettynum = models.PrettyNum.objects.all()
# 按照level排序,不加负号为从小到大,加上为从大到小
# prettynum = models.PrettyNum.objects.all().order_by("-level")
queryset = models.Admin.objects.filter(**data_dict)
# queryset=models.Admin.objects.all()
page_object=Pagination(request,queryset)
context={
"queryset":page_object.page_queryset,
"page_string":page_object.html(),
"search_data": search_data,
}
return render(request,"admain_list.html",context)
def admain_add(request):
title="新建管理员"
if request.method=="GET":
form=AdmainModeForm()
return render(request,"add.html",{'form':form,"title":title})
form=AdmainModeForm(data=request.POST)
if form.is_valid():
form.save()
return redirect("/admain/list/")
return render(request,"add.html",{'form':form,"title":title})
def admain_edit(request,nid):
row_object=models.Admin.objects.filter(id=nid).first()
if not row_object:
return redirect("/admain/list/")
title="编辑管理员"
if request.method=="GET":
form=AdmainEditModeForm(instance=row_object)
return render(request,"add.html",{'form':form,"title":title})
form=AdmainEditModeForm(data=request.POST,instance=row_object)
if form.is_valid():
form.save()
return redirect('/admain/list')
return render(request, "add.html", {'form': form, "title": title})
def admain_delete(request,nid):
models.Admin.objects.filter(id=nid).delete()
return redirect("/admain/list/")