文章目录
成品展示,实现了新建编辑和删除功能,也就是增删改查
1.新建项目
1.1settings文件中的DIRS设为空列表
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": []
顺便把根目录中的templates删除
1.2创建app
python manage.py startapp app01
上图中的工具可以自动提供前面的python manage.py,这样只需要输入startapp app01就够了
1.3紧接着在settings中注册app
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"app01.apps.App01Config"#这里注册了新建的app
]
编写表结构
from django.db import models
# Create your models here.
class Department(models.Model):
"""部门表"""
# id=models.BigAutoField(verbose_name="ID",primary_key=True)
# id=models.BigAutoField(verbose_name="ID",primary_key=True)可以自己写id,上面是bigint,下面是int,verbosename是表字段的注释
title=models.CharField(verbose_name="标题",max_length=32)
class UserInfo(models.Model):
"""员工表"""
name=models.CharField(verbose_name="姓名",max_length=16)
password=models.CharField(max_length=64)
age=models.IntegerField()
account=models.DecimalField(verbose_name="账户余额",max_digits=10,decimal_places=2,default=0)
create_time=models.DateTimeField(verbose_name="入职时间")
#如果有外键
#无约束
# depart = models.BigIntegerField()
# 1有约束约束
#to与什么表关联
#to_field与表中那一列关联
#2 django自动
#写的是depart,实际上生成的是depart_id
#3部门表被删除
#3.1如果级联删除
depart = models.ForeignKey(to="Department", to_field="id",on_delete=models.CASCADE)
#3.2置空
#如果想要置空,首先需要允许为空
# depart = models.ForeignKey(to="Department", to_field="id",blank=True,null=True,on_delete=models.SET_NULL)
gender_choices=(
(1,"男")
(2,"女")
)
gender=models.SmallIntegerField(choices=gender_choices,verbose_name="性别")
1.4在mysql中生成表
创建表
CREATE DATABASE gx_day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
修改配置文件,连接mysql
DATABASES = {
'default': {
# 说明你要连的库为mysql
'ENGINE': 'django.db.backends.mysql',
# 数据库名称
'NAME': 'gx_day16',
# IP 本地为127.0.0.1
'HOST':'127.0.0.1',
# 端口默认是3306 oracel默认端口1521
'PORT':'3306',
# 数据库用户
'USER':'root',
# 数据库密码
'PASSWORD':'123456'
}
}
迁移
找到pycharm中工具中的运行manage.py选项
直接makemigrations和migrate
在这之前记得注册app
1.5静态文件管理
1.6部门管理
体验最原始的方式
django中提供更方便的Form和ModelForm组件
- urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('depart/list/',views.depart_list),
path('depart/add/',views.depart_add),
path('depart/delete/',views.depart_delete),##删除不能写成depart/delete,delete不是url的结束,不加会报错
#/depart/10/edit/
#/depart/5/edit/
#/depart/3/edit/这样不用写问号了
path('depart/<int:eid>/edit/',#views.depart_edit),正则表达式,通过点击编辑跳转到对应id的edit界面
]
views.py
from django.shortcuts import render,redirect
from app01 import models
# Create your views here.
def depart_list(request):
queryset=models.Department.objects.all()
return render(request,"depart_list.html",{"queryset":queryset})
def depart_add(request):
if request.method=='GET':
return render(request,"depart_add.html")
else:
title=request.POST.get("title")
models.Department.objects.create(title=title)
return redirect("/depart/list")
def depart_delete(request):#用get这种最普通的方法获取id
nid=request.GET.get("nid")
models.Department.objects.filter(id=nid).delete()
return redirect("/depart/list")
def depart_edit(request,eid):
if request.method=='GET':
data_list=models.Department.objects.filter(id=eid)
return render(request,"depart_edit.html",{"name":data_list.first().title})#编辑时,获取编辑前的值
else:
#接受用户更新的title
title=request.POST.get("title")
models.Department.objects.filter(id=eid).update(title=title)
return redirect("/depart/list")
depart_list.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.navbar {
border-radius: 0;
}
</style>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</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="#">部门管理 <span class="sr-only">(current)</span></a></li>
<li><a href="#">Link</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="#">我的资料</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">注销</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div>
<div class="container">
<div >
<a class="btn btn-success" href="/depart/add"><!--可以在新页面打开,只需要添加一个target="_blank"-->
<span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>新建部门
</a>
</div>
<div class="panel panel-default" style="margin-top: 10px" >
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>部门列表
</h3>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>部门名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in queryset %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.title }}</td>
<td>
<a href="/depart/{{ obj.id }}/edit/" class="btn btn-primary btn-xs">编辑</a>
<a href="/depart/delete/?nid={{ obj.id }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>
depart_add.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</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="#">部门管理 <span class="sr-only">(current)</span></a></li>
<li><a href="#">Link</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="#">我的资料</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">注销</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div>
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
<form method="post" action="">
{% csrf_token %}
<div class="form-group">
<label for="exampleInputEmail1">标题</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="title">
</div>
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>
</div>
<script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>
depart_edit.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</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="#">部门管理 <span class="sr-only">(current)</span></a></li>
<li><a href="#">Link</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="#">我的资料</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">注销</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div>
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">修改部门</h3>
</div>
<div class="panel-body">
<form method="post" action="">
{% csrf_token %}
<div class="form-group">
<label for="exampleInputEmail1">编辑</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder={{ name }} name="title">
</div>
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>
</div>
<script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>
其中的edit动态
7 模版的继承
部门列表、添加、编辑这三个页面都有公共的部分,可以创建一个父类模板,父类模板中包含他们的公共部分,将每个页面中独有的部分放在block中。
定义模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
{% block css %}
{% endblock %}
</head>
<body>
<h1>begin</h1>
{% block content %}
{% endblock %}
<h1>end</h1>
<script src="{% static 'js/jquery-3.7.1.min.js' %}"></script>
{% block js %}
{% endblock %}
</body>
</html>
继承模版
{% extends 'i1.html' %}
{% block css %}
{% endblock %}
{% block content %}
<div>内容</div>
{% endblock %}
{% block js %}
{% endblock %}
- 每个模板可以创建多个block。类比于内容的继承,样式也可以继承,将公共使用的css、js样式放在模板页面中,然后各个子模板可以定义自己独有的样式
注意
1:form表单中要加上{% csrf_token %}
2:面板包裹的表格可能会导致表格和面板都有横线,解决办法是去掉table外面的example类的div标签
3:使用post请求的函数(edit和add)要根据请求方式分开处理
用户管理
插入数据
insert into app01_userinfo(name,password,age,account,create_time,gender,depart_id)values(“刘东”,“1234”,18,100.54,“2011-11-11”,1,1),(“王泓一”,“128246”,23,10000.54,“2023-01-01”,1,1),(“赵四”,“8877”,26,1314.54,“2022-11-11”,2,2);
"""员工表"""
name=models.CharField(verbose_name="姓名",max_length=16)
password=models.CharField(max_length=64)
age=models.IntegerField()
account=models.DecimalField(verbose_name="账户余额",max_digits=10,decimal_places=2,default=0)
create_time=models.DateTimeField(verbose_name="入职时间")
views.py函数
def user_list(request):
queryset=models.UserInfo.objects.all()
# for obj in queryset:
#obj.create_time是<class 'datetime.datetime'>类型,在Python中可以通过strftime("%Y-%m-%d")转换
#gender存储的就是1,2但是由于是通过choices定义的,通过obj.get_gender_display()可以直接输出男女,但是这只是在python中
#如果是连表可以models.Department.objects.filter(id=obj.depart_id).first().title
#但是python提供了直接通过外键连表obj.depart获取depart对象,所以obj.depart.title就可以输出depart的title
# print(obj.name,obj.password,obj.age,obj.account,obj.create_time,obj.gender,obj.depart_id,type(obj.create_time),obj.create_time.strftime("%Y-%m-%d"),obj.depart.title)
return render(request,"user_list.html",{"queryset":queryset})
user_list.html
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div>
<a class="btn btn-success" href=""><!--可以在新页面打开,只需要添加一个target="_blank"-->
<span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>新建用户
</a>
</div>
<div class="panel panel-default" style="margin-top: 10px">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>用户列表
</h3>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>余额</th>
<th>入职时间</th>
<th>性别</th>
<th>部门</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in queryset %}
<tr>
{# 模版语法中不需要加括号 |date:"Y-m-d H:i:s"#}
<td>{{ obj.id }}</td>
<td>{{ obj.name }}</td>
<td>{{ obj.password }}</td>
<td>{{ obj.age }}</td>
<td>{{ obj.account }}</td>
<td>{{ obj.create_time|date:"Y-m-d" }}</td>这里是模版特殊的格式化方法
<td>{{ obj.get_gender_display}}</td>
<td>{{ obj.depart.title}}</td>
<td>
<a href="" class="btn btn-primary btn-xs">编辑</a>
<a href="" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
新建用户
views.py函数
def user_add(request):
if request.method == 'GET':
context = {
'gender_choices': models.UserInfo.gender_choices,
"depart_list": models.Department.objects.all()
}
else:
name = request.POST.get("name")
pwd = request.POST.get("psw")
age = request.POST.get("age")
ac = request.POST.get("ac")
ctime = request.POST.get("ctime")
gd_id = request.POST.get("gd")
dp_id = request.POST.get("dp")
models.UserInfo.objects.create(name=name, password=pwd, age=age, account=ac, create_time=ctime, gender=gd_id,
depart_id=dp_id)
return redirect("/user/list/")
html文件
{% extends 'layout.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">
<form method="post" action="">
{% csrf_token %}
<div class="form-group">
<label for="exampleInputEmail1">姓名</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="name">
<label for="exampleInputEmail1">密码</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="psw">
<label for="exampleInputEmail1">年龄</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="age">
<label for="exampleInputEmail1">余额</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="ac">
<label for="exampleInputEmail1">入职时间</label>
<input type="text" class="form-control" id="exampleInputEmail1" placeholder="标题" name="ctime">
<label for="exampleInputEmail1">性别</label>
<select name="gd" id="" class="form-control">
{% for item in gender_choices %}
<option value={{ item.0 }}>{{ item.1 }}</option>
{% endfor %}
</select>
<label for="exampleInputEmail1">部门</label>
<select name="dp" id="" class="form-control">
{% for item in depart_list %}
<option value={{ item.id }}>{{ item.title }}</option>
{% endfor %}
</select>
</div>
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>
{% endblock %}
原始方式思路:不采用(本质但麻烦)
1用户提交数据没有校验
2错误,页面上应该有错误提示
3要一个一个写
4关联的数据,手动去获取并循环展示在页面
dj组件
form组件(小简便)
modelform组件(简便)
8.1初识Form和modelform
其中的depart是一个对象,需要重写models中定义的类才能直接输出title
class Department(models.Model):
def __str__(self):
return self.title
from django import forms
class UserModelForm(forms.ModelForm):
class Meta:
model = models.UserInfo
fields=["name","password","age","account","create_time","gender","depart"]#上面的代码除了UserInfo其他的都是固定模版
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for name,field in self.fields.items():
print(field,name)
field.widget.attrs={"class":"form-control"}#这里添加每个输入的样式
def user_modelFormAdd(request):
form=UserModelForm()
return render(request,"user_modelFormAdd.html",{"form":form})
{% extends 'layout.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">
<form method="post" action="">
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{# {{ form.name.label }}:{{ form.name }}#}
{# {{ form.password.label }}:{{ form.password }}#}
{# {{ form.age.label }}:{{ form.age }} 不用像这样一个一个写#}
{{ field }}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>
{% endblock %}
提示的错误信息
更改错误提示信息为中文,在settings.py文件中更改
# LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = "zh-hans"
下面是modelform实现的add用户的函数以及类的定义,写在views.py文件中
from django import forms
class UserModelForm(forms.ModelForm):
name=forms.CharField(min_length=3,label="用户名")#重写字段,这样可以设置其他的约束给name字段,这里写的是最小长度为3
password=forms.CharField(min_length=3,label="密码")#,validators=正则表达式验证
class Meta:
model = models.UserInfo
fields=["name","password","age","account","create_time","gender","depart"]
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for name,field in self.fields.items():
print(field,name)
field.widget.attrs={"class":"form-control"}
def user_modelFormAdd(request):
if request.method=='GET':
form=UserModelForm()
return render(request,"user_modelFormAdd.html",{"form":form})
else:
form=UserModelForm(data=request.POST)
if form.is_valid():
print(form.cleaned_data)
#{'name': '张成涛', 'password': 'w222', 'age': 23, 'account': Decimal('5'), 'create_time': datetime.datetime(2022, 11, 11, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='UTC')), 'gender': 1, 'depart': <Department: 销售>}
# models.UserInfo.objects.create(...)不需要这么写
form.save()
return redirect("/user/list/")
else:
# print(form.errors)
return render(request,"user_modelFormAdd.html",{"form":form})#这次这个form和get返回的是不一样的,包含了错误信息
下面是对应的html文件,这里错误提示信息新内容比较多,重点在与使用modelform的逻辑,也就是views.py里面类的定义
{% extends 'layout.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">
<form method="post" action="" novalidate>
{#这里的novalidate是把浏览器的错误提示关掉#}
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{# {{ form.name.label }}:{{ form.name }}#}
{# {{ form.password.label }}:{{ form.password }}#}
{# {{ form.age.label }}:{{ form.age }}#}
{{ field }}
<span style="color: red"> {{ field.errors.0 }}</span>
{# 错误信息很多,我们只需要第0个就行#}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>
{% endblock %}
- modelform针对数据库中的某个表
- form
8.4编辑用户
点击编辑,跳转到编辑页面,原来的ID携带过去
编辑后需要检查和提示错误,提交后更新到数据库中
先修改list中的编辑a标签的href
<a href="/user/{{ obj.id }}/edit/" class="btn btn-primary btn-xs">编辑</a>
视图文件中的编辑函数和添加函数大差不差,只是多了一个instance的使用需要注意一下
def user_edit(request, eid):
row_obj = models.UserInfo.objects.filter(id=eid).first()
if request.method == 'GET':
form = UserModelForm(instance=row_obj)
return render(request, "user_edit.html", {"form": form})
else:
form = UserModelForm(data=request.POST, instance=row_obj) # 这里不能再是直接save了,需要加一个instance,否则就是直接添加了一行
if form.is_valid():
#默认是用户输入的所有数据,如果有不希望用户输入且希望保存的
#form.instance.字段名=123
form.save()
return redirect("/user/list/")
else:
# print(form.errors)
return render(request, "user_modelFormAdd.html", {"form": form}) # 这次这个form和get返回的是不一样的,包含了错误信息
编辑的html几乎和添加用户的一样
{% extends 'layout.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">
<form method="post" action="" novalidate>
{#这里的novalidate是把浏览器的错误提示关掉#}
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label for="">{{ field.label }}</label>
{# {{ form.name.label }}:{{ form.name }}#}
{# {{ form.password.label }}:{{ form.password }}#}
{# {{ form.age.label }}:{{ form.age }}#}
{{ field }}
<span style="color: red"> {{ field.errors.0 }}</span>
{# 错误信息很多,我们只需要第0个就行#}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>
{% endblock %}
8.5删除
这个很简单,urls里面添加一个,views里面两行搞定
def user_delete(request, eid):
models.UserInfo.objects.filter(id=eid).delete()
return redirect("/user/list/")