实例:简单项目开发(一)——增删改查
前言
正式进入项目实例,完成简单项目开发。
一点点准备工作
- 新建项目
django-admin startproject myproject
- 生成应用程序
python manage.py startapp employee
- 建立数据库,连接数据库
- 在models.py中建立数据模型(类)
- 生成数据库表
生成命令如下:
python manage.py makemigrations
python manage.py migrate
数据模型类示例如下:
from django.db import models
# Create your models here.
# 单位数据模型
class Group(models.Model):
group_name = models.CharField(max_length=32, verbose_name="所在单位")
group_script = models.CharField(max_length=60, verbose_name='备注')
路由与视图的对应
为了层次清晰,我们建立两级URL配置文件,根URL是根目录下的urls.py文件,如下:
from django.contrib import admin
from django.urls import path, include
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
#path('index/', views.index),
path('employee/',
# include()函数把二级配置包含进来
include('employee.urls')),
]
二级URL配置文件如下:
path()函数的两个参数分别为相对路径、视图函数名
from django.urls import path
# 导入视图函数,*代表所有
# 建立数据表(UserInfo、Group)的增删改查配置项
from employee.views import *
urlpatterns = [
# 操作人员数据表(UserInfo)相关URL配置项
path('list_userinfo/', list_userinfo),
# path('add_userinfo', add_userinfo),
# path('edit_userinfo', edit_userinfo),
# path('del_userinfo', del_userinfo),
# 所在单位(Group)相关URL配置项
path('list_group/', list_group),
path('add_group/', add_group),
path('del_group/<int:group_id>/', del_group),
path('edit_group/<int:group_id>/', edit_group),
]
通过访问路径示例为:http://127.0.0.1:8000/employee/list_userinfo/
增删改查的函数与显示
万事俱备只欠东风,完成了数据库表和URL的创建,现在正式编写函数和动态显示界面。
在employee/views.py文件中编写相对应的视图函数,函数名据上。
实现列表查询
视图函数
#导入响应模块
from django.shortcuts import render, redirect, HttpResponse
#导入数据模型
from .models import UserInfo, Group
# Create your views here.
def list_group(request):
group_list = Group.objects.all()
return render(request, 'list_group.html', {'group_list': group_list})
html文件代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>人员信息列表</title>
</head>
<body>
<div align="center">
<h1>人员信息列表</h1>
<hr>
<div><a href="/employee/add_group">增加一条记录</a> </div>
<table border="1">
<thead>
<tr>
<td>所在单位</td>
<td>备注</td>
</tr>
</thead>
<tbody>
<!--传参 自list_userinfo函数传过来的是列表group_list 该列表来自数据模型 Group-->
{% for group in group_list %}
<tr>
<td>{{ group.group_name }}</td>
<td>{{ group.group_script }}</td>
<td><a href="/employee/del_group/{{ group.id }}/">删除</a> </td>
<td><a href="/employee/edit_group/{{ group.id }}/">修改</a> </td>
</tr>
{% empty %}
<tr>
<td colspan="4">无相关记录!</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
实现列表增加
view函数
放在同一文件中,续写:
def add_group(request):
#前端提交数据POST,获取前端HTML文件中form的<input>标签中的值
if request.method == 'POST':
group_name = request.POST.get('group_name')
group_script = request.POST.get('group_script')
if group_name.strip() == '':
return render(request, 'add_group.html', {'error_info': '单位名称不能为空'})
try:
# 获取前端传值后,新建一条记录
p = Group.objects.create(group_name=group_name, group_script=group_script)
# 此处匹配的是urls.py中的配置项,返回语句执行list_group()视图函数
return redirect('/employee/list_group/')
except Exception as e:
return render(request, 'add_group.html', {'error_info': '输入单位重复或信息错误'})
finally:
pass
# 不是POST请求,表示是第一次请求增加界面,就跳转到增加界面
return render(request, 'add_group.html')
HTML文件代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>增加部门</title>
</head>
<body>
<div align="center">
<h1>增加部门</h1>
<hr>
<!-- 设置form表单中的method,发生POST请求 -->
<form action="" method="post">
<!-- Django安全机制,防止CSRF -->
{% csrf_token %}
<input type="hidden" name="id" id="id" value="{{ group.id }}">
<div>
<label>部门:</label>
<!-- 输入,后端通过name属性取值,id 是name的属性,函数通过属性取值 -->
<input type="text" name="group_name" id="group_name">
</div>
<br>
<div>
<label>备注:</label>
<input type="text" name="group_script" id="group_script">
</div>
<br>
<div><input type="submit" value="保存"></div>
</form>
</div>
<!-- 显示错误信息 -->
{{ error_info }}
</body>
</html>
实现列表删除
view函数
继续续写:
def del_group(request, group_id):
group_object = Group.objects.get(id=group_id)
group_object.delete()
return redirect('/employee/list_group/')
HTML文件代码
通过group_list界面中的按钮直接访问,不需要HTML界面。
实现列表修改
view函数
def edit_group(request, group_id):
# 判断请求方式
if request.method == 'POST':
id = request.POST.get('id')
# 获取前端提交的数据
group_name = request.POST.get('group_name')
group_script = request.POST.get('group_script')
# 取出数据表记录
group_object = Group.objects.get(id=id)
# 给字段赋值
group_object.group_name = group_name
group_object.group_script = group_script
# 保存数据到数据库表
group_object.save()
return redirect('/employee/list_group/')
else:
# 不是POST提交,就是第一次请求,先取id,来自urls.py配置项,从首页获取。传参给edit_html文件
group_object = Group.objects.get(id=group_id)
return render(request, 'edit_group.html', {'Group': group_object})
HTML文件代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改</title>
</head>
<body>
<div align="center">
<h1>修改部门</h1>
<hr>
<form action="" method="post">
{% csrf_token %}
<!-- 用一个type='hidden'的<input>标签保存id值,为视图函数修改记录时,提供主键值//-->
<input type="hidden" name="id" id="id" value="{{ Group.id }}" >
<div>
<label>部门:</label>
<input type="text" name="group_name" id="group_name" value="{{ Group.group_name }}">
</div>
<br>
<div>
<label>备注:</label>
<input type="text" name="group_script" id="group_script" value="{{ Group.group_script }}">
</div>
<br>
<div><input type="submit" value="保存"></div>
</form>
{{ error_info }}
</div>
</body>
</html>