目录
第一章:初识Django
第二章:Django模板语法
第三章:orm模块
第四章:案例—用户管理
第五章:Form和ModelForm
第六章:Cookie和Session
第七章:初始ajax
第八章:总结
经过前期的学习,我们掌握了最基本的用法,这期将把后面的知识点全部使用,只给大家简单说一下,具体知识点还是按流程来,给大家看一下成品:
这就是我们学习完之后的知识点,能做出来的,这个页面有些不太好看,我们可以用css来修饰,给大家看我的源码:
from django.db import models
# 部门类
class Department(models.Model):
title = models.CharField(verbose_name='标题', max_length=32)
def __str__(self):
return self.title
# 员工类
class UserInfo(models.Model):
name = models.CharField(verbose_name='姓名', max_length=16)
password = models.CharField(verbose_name='密码', max_length=64)
age = models.IntegerField(verbose_name='年龄')
account = models.DecimalField(verbose_name='余额', max_digits=10, decimal_places=2, default=0)
create_time = models.DateField(verbose_name='入职时间')
# to与哪张表关联
# to_field 表中的哪一列关联
# Django 自动后面生成_id
# 若部门删除
# 1)级联删除 on_delete=models.CASCADE
# 2) 置空 null=ture black=ture
depart = models.ForeignKey(verbose_name="部门", to="Department", to_field="id", on_delete=models.CASCADE)
gender_choices = (
(1, "男"),
(2, "女"),
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
# 管理员类
class Admin(models.Model):
username = models.CharField(verbose_name="用户名", max_length=32)
password = models.CharField(verbose_name="密码", max_length=64)
这里涉及到了主键约束,和级联删除,代码中有注释
urlpatterns = [
# path('admin/', admin.site.urls),
path('depart/list/', views.depart_list),
path('uesr/model/form/add/', views.user_model_form_add),
path('main/page/', views.main_page),
# 将id传递
path('user//edit/', views.user_edit),
path('user//data/', views.user_data),
path('admin/list/', views.admin_list),
path('admin/add/', views.admin_add),
path('admin//edit/', views.admin_edit),
path('admin//delet/', views.admin_delet),
path('admin//edit/password/', views.admin_edit_password),
path('admin/login/', views.login),
path('admin/logout/', views.logout)
]
这些都是url与函数的对应关系。
首先给大家看我我们要导入的模块
# 导入forms模块
from django import forms
# 导入正则表达式
from django.core.validators import RegexValidator
# 导入自己设置报错模块
from django.core.exceptions import ValidationError
# 导入django自带的md5加密的盐
from django.conf import settings
# 导入中间件
from django.utils.deprecation import MiddlewareMixin
# 运用md5将数据库密码加密
def md5(data_string):
obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8'))
obj.update(data_string.encode('utf-8'))
return obj.hexdigest()
# 定义bootstrap类
class BootStrapModelForm(forms.ModelForm):
# 定义init方法
def __init__(self, *args, **kwargs):
# 执行父类的init方法
super().__init__(*args, **kwargs)
# 循环modelform每一个字段,设置字段的插件
for name, field in self.fields.items():
if field.widget.attrs:
# 若字典内有值
field.widget.attrs["class"] = "form-control"
else:
# 若字典内有值
field.widget.attrs = {"class": "form-control"}
# 定义中间件
class AuthMiddleWare(MiddlewareMixin):
def process_request(self, request):
# 排除不需要登陆就可以访问的页面
if request.path_info == "/admin/login/":
return
# 读取访问用户的session信息
info_dict = request.session.get("info")
if info_dict:
return
# 若没登陆去登录页面
return redirect('/admin/login/')
# 继承bootstrap类
class UserModelForm(BootStrapModelForm):
name = forms.CharField(min_length=2,
label="用户名",
# validators=正则表达式(方式一)
# validators=RegexValidator())
)
# 正则表达式
RegexValidator()
class Meta:
model = models.UserInfo
fields = ["name", "password", "age", "account", "create_time", "depart", "gender"]
# 方式2(定义钩子方法)
def clean_name(self):
txt_name = self.cleaned_data["name"]
# 钩子方法校验
if len(txt_name) > 10:
raise ValidationError("格式错误")
# 验证通过返回(必须这样写)
return txt_name
# 定义新的modelform管理员密码类
# 并继承Bootstrap父类
class AdminEditPasswordModelForm(BootStrapModelForm):
confirm_password = forms.CharField(label="确认密码", widget=forms.PasswordInput(render_value=True))
class Meta:
model = models.Admin
fields = ['password', 'confirm_password']
def clean_password(self):
# 获得用户输入的密码
pwd = self.cleaned_data.get("password")
# 用md5将数据加密
md5_pwd = md5(pwd)
# 在数据库中搜索id,password
exists = models.Admin.objects.filter(id=self.instance.pk, password=md5_pwd).exists()
if exists:
raise ValidationError("重置的密码不能与之前的相同")
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
# 员工主页面
def main_page(request):
# 去数据库中拿到所有信息
model_user_info = models.UserInfo.objects.all()
# 建数据库中信息传入前端
return render(request, 'main_page.html', {"objects": model_user_info})
# 员工存储页面
def user_model_form_add(request):
# 用户访问get方式
if request.method == "GET":
form = UserModelForm()
return render(request, 'user_model_form_add.html', {"form": form})
# 用户post请求提交数据,校验数据
form = UserModelForm(data=request.POST)
if form.is_valid():
# 校验正确存入库
form.save()
return redirect('/main/page/')
else:
return render(request, 'user_model_form_add.html', {"form": form})
# 编辑员工信息
def user_edit(request, nid):
row_object = models.UserInfo.objects.filter(id=nid).first()
if request.method == "GET":
form = UserModelForm(instance=row_object)
return render(request, 'user_edit.html', {"form": form})
elif request.method == "POST":
form = UserModelForm(data=request.POST, instance=row_object)
if form.is_valid():
form.save()
# 重定向回主页面
return redirect('/main/page')
return render(request, 'user_edit.html', {"form": form})
# 删除员工信息
def user_data(request, nid):
models.UserInfo.objects.filter(id=nid).delete()
# 删除后重定向
return redirect('/main/page')
# 管理员列表
def admin_list(request):
queryset = models.Admin.objects.all()
return render(request, 'admin_list.html', {"queryset": queryset})
# 新建管理员
def admin_add(request):
title = "新建管理员"
if request.method == "GET":
form = AdminModelForm()
return render(request, 'admin_add.html', {'form': form, 'title': title})
form = AdminModelForm(data=request.POST)
if form.is_valid():
form.save()
return redirect('/admin/list/')
return render(request, 'admin_add.html', {'form': form, "title": title})
# 编辑管理员
def admin_edit(request, nid):
title = "管理员编辑表"
row_object = models.Admin.objects.filter(id=nid).first()
if not row_object:
return redirect('/admin/list/')
# get请求
if request.method == 'GET':
form = AdminModelForm(instance=row_object)
return render(request, 'admin_edit.html', {"title": title, "queryset": form})
# post请求保存到数据库
elif request.method == "POST":
form = AdminModelForm(data=request.POST, instance=row_object)
if form.is_valid():
# 校验正确保存到数据库
form.save()
return redirect('/admin/list/')
return render(request, 'admin_edit.html', {"queryset": form})
# 删除管理员
def admin_delet(request, nid):
models.Admin.objects.filter(id=nid).delete()
# 重定向回列表页面
return redirect('/admin/list/')
# 重置密码
def admin_edit_password(request, nid):
row_object = models.Admin.objects.filter(id=nid).first()
if not list:
return redirect('/admin/list/')
title = '重置管理员密码----{}'.format(row_object.username)
if request.method == "GET":
form = AdminEditPasswordModelForm(instance=row_object)
return render(request, 'admin_edit_password.html', {"queryset": form, "title": title})
elif request.method == "POST":
form = AdminEditPasswordModelForm(data=request.POST, instance=row_object)
if form.is_valid():
form.save()
return redirect('/admin/list/')
return render(request, 'admin_edit_password.html', {"queryset": form, "title": title})
# 管理员登录类
class LoginForm(forms.Form):
username = forms.CharField(label="用户名", widget=forms.TextInput, required=True)
password = forms.CharField(label="密码", widget=forms.PasswordInput(render_value=True), required=True)
def clean_password(self):
pwd = self.cleaned_data.get("password")
return md5(pwd)
# 管理员登录界面
def login(request):
if request.method == "GET":
form = LoginForm()
return render(request, 'login.html', {"form": form})
elif request.method == "POST":
form = LoginForm(data=request.POST)
if form.is_valid():
# 去数据库校验账号和密码,获取用户对象
admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
if not admin_object:
# 主动添加错误
form.add_error("password", "用户名或密码不正确")
return render(request, 'login.html', {"form": form})
# 进行cookie认证和session
# 若正确,网站生成随机字符串,写到用户的浏览器cookie中,再写到session中
else:
# 写入session中
request.session["info"] = {"id": admin_object.id, "name": admin_object.username}
# 登录成功进行重定向
return redirect('/main/page/')
return render(request, 'login.html', {"form": form})
# 注销登录
def logout(request):
request.session.clear()
return redirect('/admin/login')
这就是views的所有代码,给大家看一下前端的代码
首先:
Title
{{ title }}注册表
Title
{{ title }}
Title
{{ title }}
Title
新建管理员
管理员中心
id
姓名
密码
密码操作
操作
{% for obj in queryset %}
{{ obj.id }}
{{ obj.username }}
*********
重置密码
编辑
删除
{% endfor %}
Document
Title
Title
新建员工
用户信息中心
id
姓名
密码
年龄
余额
入职时间
性别
部门
操作
{% for obj in objects %}
{{ obj.id }}
{{ obj.name }}
{{ obj.password }}
{{ obj.age }}
{{ obj.account }}
{{ obj.create_time|date:"Y-m-d" }}
{{ obj.get_gender_display }}
{{ obj.depart.title }}
编辑
删除
{% endfor %}
Title
编辑用户
Title
用户管理系统注册表
以上就是该程序的所有代码,只有登陆页面加了css
以上就是本期的分享,在后续的文章中给大家说明原理,并且代码内附注释,我们下期见