基于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和数据库表之间的映射,除此之外还提供数据查询和数据获 ...
随机推荐
- Ubuntu更改 resolv.conf 重启失效
更改Ubuntu的 resolv.conf的时候,重启的时候,经常又给重置了.google大法找到方法. sudo apt-get install resolvconf 原来Ubuntu的resol ...
- EF 导航属性的使用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- WPF ObjectDataProvider的使用-只能检索用
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- GlusterFS集群文件系统研究(负载均衡的最常用办法) good
http://blog.csdn.net/liuaigui/article/details/6284551 http://blog.csdn.net/liuaigui/article/details/ ...
- C#图片保存与读取,以及图片另存
照片的保存与读取 /// <summary> /// 图片转二进制 /// </summary> /// <param name="imgPhoto" ...
- WPF ListView 数据懒加载
实现方式:当滑动条触底时,加载数据 xaml代码: <ListView ScrollViewer.ScrollChanged="ListView_ScrollChanged" ...
- JS获取a标签的Href 内容
<script type="text/javascript">function getHref(obj){ alert(obj.href);} </script& ...
- Android实现简单音乐播放器(startService和bindService后台运行程序)
Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...
- HTTPS上线过程说明(阿里云提供免费证书)
一.上马HTTPS的原因: ①.苹果App Store强制其平台上的app均要使用HTTPS ②.网站经常被劫持,用户和领导希望使用HTTPS ③.跟随HTTPS的大趋势 二.应用上马HTTPS之部门 ...
- QT5.1编译后的安装目录问题(硬路径问题)
这个是我的编译参数:configure -ltcg -confirm-license -opensource -platform win32-msvc2010 -debug-and-release - ...