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

练习点:

数据库建表

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. 微信红包功能(含示例demo)

    开通支付权限 登录微信公众平台管理后台,找到“微信支付”一栏,进行开通会跳转到“微信支付商户平台”,根据提示提交相关证明,完成支付权限的开通开通之后,“微信支付”一栏会显示相关信息,在“开发-接口权限 ...

  2. jquery.cookie.js用法详解

    创建一个会话cookie: $.cookie(‘cookieName’,'cookieValue’); 注:当没有指明cookie时间时,所创建的cookie有效期默认到用户浏览器关闭止,故被称为会话 ...

  3. VisualStateManager

    管理控件状态和管理控件状态的转换逻辑 <Window.Resources> <Style TargetType="Button" x:Key="Anim ...

  4. QWidget继承自QPaintDevice,这样就可以直接把QWidget传入QPainter的构造函数,比如QPainter(mylabel),然后设置QWidget的长宽后直接进行作画了

    比如用QLabel在主界面上画两条虚线: bool ContentWidget::eventFilter(QObject *obj, QEvent *event) { if(obj == line_l ...

  5. jquery模拟飞秋

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

  6. C++ Boost 学习资源列表

    文档书籍下载 Boost Documentation Boost代码下载       优秀网站导航 Boost官方网站 Boost中文站 Boost Consulting     专题资源报告 Lin ...

  7. Java发展历程

    Java 的发展要追溯到 1991 年,Patrick Naughton(帕特里克·诺顿)和 James Gosling(詹姆斯·高斯林)带领 Sun 公司的工程师打算为有线电视转换盒之类的消费产品设 ...

  8. API Hook基本原理和实现

    API Hook基本原理和实现 2009-03-14 20:09 windows系统下的编程,消息message的传递是贯穿其始终的.这个消息我们可以简单理解为一个有特定意义的整数,正如我们看过的老故 ...

  9. 【转】跟面试官聊.NET垃圾收集,直刺面试官G点

    装逼的面试官和装逼的程序员 我面试别人的时候,经常是按这种路子来面试: 看简历和面试题,从简历和面试题上找到一些技术点,然后跟应聘者聊. 聊某个技术点的时候,应聘者的回答会牵涉到其他的技术点,然后我会 ...

  10. xen学习(一)

    添加镜像源 [root@xen xen]# cat /etc/yum.repos.d/xen.repo [xen] name=xenserver baseurl=http://mirrors.163. ...