基于Django框架 CRM的增删改查
思路: 创建表------从数据库读出数据展示出来------配置路由-----写视图函数------写对应页面
练习点:
数据库建表
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的增删改查的更多相关文章
- 基于vue-easytable实现数据的增删改查
基于vue-easytable实现数据的增删改查 原理:利用vue的数据绑定和vue-easetable的ui完成增删改查 后端接口: 1.条件查询表中数据 http://localhost:4795 ...
- Spring JdbcTemplate框架搭建及其增删改查使用指南
Spring JdbcTemplate框架搭建及其增删改查使用指南 前言: 本文指在介绍spring框架中的JdbcTemplate类的使用方法,涉及基本的Spring反转控制的使用方法和JDBC的基 ...
- MyBatis学习(三)MyBatis基于动态代理方式的增删改查
1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBa ...
- SSHE框架整合(增删改查)
1.前期准备:jar包(c3p0.jdbc ,各个框架) web.xml文件:spring的 转码的,和Struts2的过滤器 <?xml version="1.0" e ...
- 基于SpringMVC的文件(增删改查)上传、下载、更新、删除
一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...
- django -- ORM实现图书增删改查
表结构设计 上篇我们实现了出版社的增删改查,出版社数据表有两个字段id和name,那图书的表结构怎么设计呢?图书也要有一个主键id,还要有一个名称title,是哪个出版社的,要有个字段press和Pr ...
- ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)
Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...
- 快速入门GreenDao框架并实现增删改查案例
大家的项目中不可避免的使用到SQLite,为此我们要花费心思编写一个增删改查框架.而一个好的ORM框架则能够给我们带来极大的方便,今天给大家讲解一个非常火热的ORM-GreenDao. 基本概念 Gr ...
- hibernate框架(1)---Hibernate增删改查
Hibernate增删改查 1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获 ...
随机推荐
- WPF中的文字修饰——上划线,中划线,基线与下划线
原文:WPF中的文字修饰——上划线,中划线,基线与下划线 我们知道,文字的修饰包括:空心字.立体字.划线字.阴影字.加粗.倾斜等.这里只说划线字的修饰方式,按划线的位置,我们可将之分为:上划线.中划线 ...
- WPF 多路绑定
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- easy-mock介绍
今天推荐一个好用的前端 mock 工具,Easy Mock,目前由大搜车无线架构团队进行维护,让我觉得特别好用的一点是 它支持 swagger(一个能称为框架的 API 书写工具),并能够基于 Swa ...
- C#6.0一些特性
1.自动属性初始化的改进 声明属性时可以直接进行初始化 public int id {get;set;}=10; 自动属性是省去了get和set内部的过程,而直接用set;get;这样的语句代替, 把 ...
- 一份React-Native学习指南
直击现场 学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南 本指南汇集Rea ...
- Qt使用第三方库3rdparty
简述 在 Qt 中经常会用到第三方库,例如:FFmpeg.OpenCV 等.第三方库的使用比较简单,只需要一些基本的配置就可以搞定,一起来看看吧! 简述 第三方库 源代码 库文件 目标目录 第三方库 ...
- Delphi 的RTTI机制浅探3(超长,很不错)
转自:http://blog.sina.com.cn/s/blog_53d1e9210100uke4.html 目录========================================== ...
- 小试X64 inline HOOK,hook explorer.exe--->CreateProcessInternalW监视进程创建
原始函数是这样的 kernel32!CreateProcessInternalW: 00000000`7738e750 4c8bdc mov r11,rsp 00000000 ...
- Dependency Injection 筆記 (2)
续上集,接着要说明如何运用 DI 来让刚才的范例程序具备执行时期切换实现类型的能力. (本文摘自電子書<.NET 依賴注入>) 入门范例—DI 版本 为了让 AuthenticationS ...
- 预编译加速编译(precompiled_header),指定临时文件生成目录,使项目文件夹更干净(MOC_DIR,RCC_DIR, UI_DIR, OBJECTS_DIR),#pragma execution_character_set("UTF-8")"这个命令是在编译时产生作用的,而不是运行时
预编译加速编译 QT也可以像VS那样使用预编译头文件来加速编译器的编译速度.首先在.pro文件中加入: CONFIG += precompiled_header 然后定义需要预编译的头文件: PREC ...