思路: 创建表------从数据库读出数据展示出来------配置路由-----写视图函数------写对应页面

练习点:

数据库建表

ORM 数据库数据读取 数据

ModelForm  (form组件是基础)

模板渲染在页面上循环取出form里字段的数据

拾遗:

在html中 可以使用 forloop.counter  在页面显示编号的序列, 而不是直接显示数据库里对应的  id 号

<td>{{ field.id }}</td>#}

<!--不会显示出来后端数据库的id字段 -->

<td>{{ forloop.counter }}</td>



在 Employee 的 model中 一个 gender 字段
gender = models.IntegerField(choices=((1,"男"),(2,"女")))
在 html 中
<td>{{ field.get_gender_display }}</td>
<!-- 拿到元组choices 第二个值 "男" 页面不显示 1 -->
<tbody>
{% for field in employee_queryset %}
<tr><!--不会显示出来后端数据库的id字段 -->
<td>{{ forloop.counter }}</td>
<td>{{ field.employee_name }}</td> <td>{{ field.get_gender_display }}</td>
<!--拿到元组第二个值 "男" 页面不显示1--> <td>{{ field.department.name }}</td>
<td><a href="/edit_employee/{{ field.pk }}">编辑</a></td>
<td><a href="/delete_employee/{{ field.pk }}">删除</a></td>
</tr>
{% endfor %}
</tbody>

1. 创建表

部门表

员工表  (和部门表  多对一的关系)

员工角色表  (和部门表  多对多的关系)

from django.db import models

class Employee(models.Model):
# id = models.AutoField(primary_key=True)
employee_name = models.CharField(max_length=32)
gender = models.IntegerField(choices=((1,"男"),(2,"女")))
department = models.ForeignKey(to="Department",to_field="id",on_delete=models.CASCADE)
duty = models.ManyToManyField(to="Duty") class Department(models.Model):
# id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, null=True)
employee_num = models.CharField(max_length=32) def __str__(self):
return self.name class Duty(models.Model):
# id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
def __str__(self):
return self.name

2. 部门表的操作

2.1 从数据库取出数据    显示部门列表

from app01.models import Department,Employee
from django.shortcuts import render, HttpResponse, redirect
from django import forms # --------------部门 读取数据 显示到页面------------------------------------
def index(request):
dep_queryset=Department.objects.all()
print(dep_queryset)
return render(request,"index.html",{"dep_queryset":dep_queryset}) ------------- 显示到 html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
INDEX
<hr>
<a href="/add/">添加部门</a>
<table>
<thead>
<tr>
<th>编号</th>
<th>部门名称</th>
<th>部门人数</th>
<th>操作</th> </tr>
</thead>
<tbody>
{% for field in dep_queryset %}
<tr>
{# <td>{{ field.id }}</td>#}
<!--不把数据库的id显示出来 -->
<td>{{ forloop.counter}}</td> <td>{{ field.name }}</td>
<td>{{ field.employee_num }}</td>
<td><a href="/edit/{{ field.pk }}">编辑</a></td>
<td><a href="/delete/{{ field.pk }}">删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

2.2 添加 (使用 ModelForm 实现)

2.2.1. 创建 部门的 ModelForm 类

class DepartmentModelForm(forms.ModelForm):
class Meta:
model=Department
#加参数
fields="__all__" #表示所有字段 # 全局设置, 没有加label的字段就还是按字段名
labels={
"id":"部门编号",
"name":"部门名称",
"employee_num":"部门人数",
} #初始化把样式调出来
def __init__(self,*args,**kwargs):
super().__init__(*args, **kwargs) # 父类里面的__init__
# 调节id name employee_num 样式
print(self.fields,type(self.fields))
for field in self.fields.values():
field.error_messages = {"required": "不能为空"} # 批量处理

2.2.2. 添加数据

先走get请求获取页面   在走一边post请求 添加

def add(request):
if request.method == "GET" :
form = DepartmentModelForm()
return render(request,"add.html",{"form":form}) else:
form = DepartmentModelForm(request.POST)
if form.is_valid():
form.save() #取出数据 绑定关系
ret=index(request)
return ret
# return redirect(request,"index.html")
else:
return render(request, "add.html", {"form": form})

2.2.3. 渲染的html页面  (添加部门)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>
添加部门
</h3> <form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %} <div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div> {% endfor %}
<input type="submit" value="提交">
</form> </body>
</html>

2.3 编辑 (ModelForm)

编辑和添加的步奏基本是一样   唯一不同的一点就是 编辑需要传入一个参数   这个参数代表的是被删除的数据的id

def edit(request,id):
edit_num = Department.objects.filter(pk=id).first() # 被编辑的
if request.method == "GET" :
form = DepartmentModelForm(instance=edit_num) # 直接把被编辑的对象之前的值显示出来
# 不含instance 显示出来的input标签内是空的 就是一个添加页面
return render(request,"edit.html",{"form":form}) else:
edit_num = Department.objects.filter(pk=id).first() # 被编辑的
form = DepartmentModelForm(request.POST,instance=edit_num)
if form.is_valid():
form.save() #取出数据 绑定关系
ret=index(request)
return ret
# return redirect(request,"index.html")
else:
return render(request, "edit.html", {"form": form})

渲染的html页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <h3>
编辑
</h3> <form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %} <div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" value="提交">
</form> </body>
</html>

2.4 删除

删除就是要找到需要被删除数据对应的id号 即可

def delete(request,id):
Department.objects.filter(pk=id).delete()
ret = index(request)
return ret
# return redirect(request,"index.html")

3. 员工表的操作

3.1 从数据库取出数据   页面显示员工列表

def employee_index(request):
employee_queryset = Employee.objects.all()
return render(request, "employee.html", {"employee_queryset": employee_queryset})

html 页面的显示

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
员工表
<hr>
<a href="/add_employee/">添加员工信息</a>
<table>
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>部门</th> </tr>
</thead>
<tbody>
{% for field in employee_queryset %}
<tr>
{# <td>{{ field.id }}</td>#}
<!--不会显示出来后端数据库的id字段 -->
<td>{{ forloop.counter }}</td>
<td>{{ field.employee_name }}</td> <td>{{ field.get_gender_display }}</td>
<!--拿到元组第二个值 "男" 页面不显示1--> <td>{{ field.department.name }}</td> <td><a href="/edit_employee/{{ field.pk }}">编辑</a></td>
<td><a href="/delete_employee/{{ field.pk }}">删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

3.2 添加 (ModelForm)

3.2.1 创建一个员工 EmployeeModelForm 的类

class EmployeeModelForm(forms.ModelForm):
class Meta:
model = Employee
# 加参数
fields = "__all__" # 表示所有字段 labels={
"id": "员工编号",
"employee_name": "员工姓名",
"gender": "性别",
"department": "所在部门",
"duty": "职责",
} # 初始化把样式调出来
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 父类里面的__init__
# 调节id name gender department duty 样式
print(self.fields, type(self.fields))
for field in self.fields.values():
field.error_messages = {"required": "不能为空"} # 批量处理

3.2.2 添加数据

def employee_add(request):
if request.method == "GET":
form = EmployeeModelForm()
return render(request,"add_employee.html",{"form":form})
else:
form = EmployeeModelForm(request.POST)
if form.is_valid():
form.save()
ret= employee_index(request)
return ret
else:
return render(request,"add_employee.html",{"form":form})

3.2.3 渲染的html页面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>
添加员工
</h3> <form action="" method="post">
{% csrf_token %}
{% for field in form %} <div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div> {% endfor %}
<input type="submit" value="提交">
</form> </body>
</html>

3.3 编辑 (ModelForm)

编辑和添加的步奏基本是一样   唯一不同的一点就是 编辑需要传入一个参数   这个参数代表的是被删除的数据的id

def employee_edit(request,id):
edit_num = Employee.objects.filter(pk=id).first() # 被编辑的
if request.method == "GET" :
form = EmployeeModelForm(instance=edit_num) # 直接把被编辑的对象之前的值显示出来
# 不含instance 显示出来的input标签内是空的 就是一个添加页面 return render(request,"edit_employee.html",{"form":form}) else:
edit_num = Employee.objects.filter(pk=id).first() # 被编辑的
form = EmployeeModelForm(request.POST,instance=edit_num)
if form.is_valid():
form.save() #取出数据 绑定关系
ret=employee_index(request)
return ret
# return redirect(request,"index.html")
else:
return render(request, "edit_employee.html", {"form": form})

渲染的html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>
添加员工
</h3> <form action="" method="post">
{% csrf_token %}
{% for field in form %} <div class="form-group">
<label for="title">{{ field.label }}</label>
{{ field }}
<span>{{ field.errors.0 }}</span>
</div> {% endfor %}
<input type="submit" value="提交">
</form> </body>
</html>

3.4 删除

删除就是要找到需要被删除数据对应的id号 即可

def employee_delete(request,id):
Employee.objects.filter(pk=id).delete()
ret = employee_index(request)
return ret

基于Django框架 CRM的增删改查的更多相关文章

  1. 基于vue-easytable实现数据的增删改查

    基于vue-easytable实现数据的增删改查 原理:利用vue的数据绑定和vue-easetable的ui完成增删改查 后端接口: 1.条件查询表中数据 http://localhost:4795 ...

  2. Spring JdbcTemplate框架搭建及其增删改查使用指南

    Spring JdbcTemplate框架搭建及其增删改查使用指南 前言: 本文指在介绍spring框架中的JdbcTemplate类的使用方法,涉及基本的Spring反转控制的使用方法和JDBC的基 ...

  3. MyBatis学习(三)MyBatis基于动态代理方式的增删改查

    1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBa ...

  4. SSHE框架整合(增删改查)

    1.前期准备:jar包(c3p0.jdbc ,各个框架) web.xml文件:spring的   转码的,和Struts2的过滤器 <?xml version="1.0" e ...

  5. 基于SpringMVC的文件(增删改查)上传、下载、更新、删除

    一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...

  6. django -- ORM实现图书增删改查

    表结构设计 上篇我们实现了出版社的增删改查,出版社数据表有两个字段id和name,那图书的表结构怎么设计呢?图书也要有一个主键id,还要有一个名称title,是哪个出版社的,要有个字段press和Pr ...

  7. ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)

    Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...

  8. 快速入门GreenDao框架并实现增删改查案例

    大家的项目中不可避免的使用到SQLite,为此我们要花费心思编写一个增删改查框架.而一个好的ORM框架则能够给我们带来极大的方便,今天给大家讲解一个非常火热的ORM-GreenDao. 基本概念 Gr ...

  9. hibernate框架(1)---Hibernate增删改查

    Hibernate增删改查 1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获 ...

随机推荐

  1. WPF中的Application类。

    原文:WPF中的Application类. Application对象用的名称空间是system.windows 1.手动创建Application对象步骤. 1.1).把项目中的App.Xaml文件 ...

  2. PostSharp-5.0.26安装包_KeyGen发布_支持VS2017

    PostSharp-5.0.26安装包_KeyGen发布_支持VS2017 请低调使用. PostSharp安装及注册步骤截图.rar 请把浏览器主页设置为以下地址支持本人.https://www.d ...

  3. StepShot4.3.0安装包_KeyGen发布

    StepShot是一个可以方便快速的制作操作手册的软件,功能相当强悍. 请低调使用. -------------------------------华丽的分割线-------------------- ...

  4. redis 从0到1 linux下的安装使用 数据类型 以及操作指令 一

    安装 redis 到 /usr/目录下 我这里安装的是redis-3.2.9.tar.gz tar zxvf  redis-3.2.9.tar.gz  -C  /usr 然后进行 执行编译命令 mak ...

  5. js 点击超链接,执行js脚本,而不进行url跳转

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  6. WPF常见内存泄露

    Event handlers leak This type of leak occurs when subscribing an object (let's call it listener) to ...

  7. QT+OpenGL读取显示图片,OpenGL在QT里的刷新问题(好几篇)

    GLuint readImage(char *filename){    GLuint tex_id;    GLint alignment; QImage tex, buf;    buf.load ...

  8. Realm_King 之 .NET 打包详细教程(A)

    最近一直在winform程序开发,听说身边的人不是很了解打包,给大家提供一点简单的打包,相信能看懂的... (一)右键解决方案: 在弹出"添加新项目"窗体中找到  其他项目类型=& ...

  9. Boyer-Moore字符串查找算法的实现

    前段时间在园子里看到一篇讲Boyer-Moore算法原理的文章http://kb.cnblogs.com/page/176945/,写的很详细,于是在这里自己写个C语言的实现,权当是练手吧. 基本思路 ...

  10. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发2-Model层建立

    上篇(asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作)文章讲解了开发过程中的准备工作,主要创建了项目数据库及项目,本文主要讲解项目M层的实现,M层这里 ...