Django4全栈进阶之路20 项目实战(三种方式开发部门管理):方式一:FBV
1、模型
from django.db import models
from django.contrib.auth.models import User # Create your models here.
class Department(models.Model):
name = models.CharField(max_length=255, verbose_name='部门名称')
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children',
verbose_name='父级部门')
description = models.TextField(blank=True, null=True, verbose_name='部门介绍')
sort = models.IntegerField(default=1, verbose_name="显示排序", help_text="显示排序")
owner = models.CharField(max_length=32, verbose_name="负责人", null=True, blank=True, help_text="负责人")
phone = models.CharField(max_length=32, verbose_name="联系电话", null=True, blank=True, help_text="联系电话")
email = models.EmailField(max_length=32, verbose_name="邮箱", null=True, blank=True, help_text="邮箱")
status = models.BooleanField(default=True, verbose_name="部门状态", null=True, blank=True, help_text="部门状态")
created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='departments_created', to_field='id',
verbose_name='创建账号')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='departments_updated', to_field='id',
verbose_name='修改账号')
updated_at = models.DateTimeField(auto_now=True, verbose_name='最后修改时间') def __str__(self):
return self.name class Meta:
verbose_name = '部门'
verbose_name_plural = '部门'
2、视图
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseBadRequest
from django.shortcuts import redirect, render, get_object_or_404 from BaseApp.models import Department @login_required
def depart_list_view(request):
depart = Department.objects.all
if depart:
return render(request, 'base/depart/depart_list.html', {'departments': depart})
else:
error_msg = "No data was found"
return render(request, 'base/depart/depart_list.html', {'error_msg': error_msg}) @login_required
def depart_create_view(request):
if request.method == 'POST':
name = request.POST.get('name')
description = request.POST.get('description')
if not name:
# return HttpResponseBadRequest("部门名称不能为空")
error_msg = '部门名称不能为空'
return render(request, 'base/depart/depart_add.html', {'error_msg': error_msg})
# 判断部门是否已经存在
if Department.objects.filter(name=name).exists():
# return HttpResponseBadRequest("部门已经存在")
error_msg = '部门已经存在'
return render(request, 'base/depart/depart_add.html', {'error_msg': error_msg})
if name and description:
Department.objects.create(name=name, description=description)
return redirect('depart_list')
return render(request, 'base/depart/depart_add.html') @login_required
def depart_update_view(request, pk):
department = get_object_or_404(Department, pk=pk)
if request.method == 'POST':
name = request.POST.get('name')
description = request.POST.get('description')
if not name:
return HttpResponseBadRequest("部门名称不能为空")
department.name = name
department.description = description
department.save()
return redirect('depart_list') return render(request, 'base/depart/depart_edit.html', {'department': department}) @login_required
def depart_delete_view(request, pk):
try:
qs = Department.objects.get(id=pk)
except Department.DoesNotExist:
error_msg = '部门不存在'
return redirect('depart_list', error_msg=error_msg)
else:
qs.delete()
return redirect('depart_list')
3、路由
from django.urls import path from . import views # 路由
urlpatterns = [
# FBV模式
path('depart/list/', views.depart_list_view, name='depart_list'),
path('depart/add/', views.depart_create_view, name='depart_add'),
path('depart/edit/<int:pk>/', views.depart_update_view, name='depart_edit'),
path('depart/delete/<int:pk>/', views.depart_delete_view, name='depart_delete'),
4、前端模板
depart_add.html
{% extends 'base.html' %}
{% block content %}
<div class="card mt-3">
<div class="card-header"> 新增部门</div>
<div class="card-body">
<form method="POST">
{% csrf_token %}
{% if error_msg %}
<p class="error">{{ error_msg }}</p>
{% endif %}
<div class="form-group">
<label for="name">部门名称:</label>
<input type="text" id="name" name="name" required class="form-control">
</div>
<br>
<div class="form-group">
<label for="description">部门介绍:</label>
<textarea id="description" required class="form-control"></textarea>
</div>
<br>
<button type="submit" class="btn btn-primary">保存</button>
</form>
</div>
</div>
{% endblock %}

depart_edit.html
{% extends 'base.html' %}
{% block content %}
<div class="card mt-3">
<div class="card-header">编辑部门信息</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
<div class="form-group">
<label for="name">部门名称</label>
<input type="text" class="form-control" id="name" name="name" value="{{ department.name }}" required>
</div>
<div class="form-group">
<label for="description">部门描述</label>
<textarea class="form-control" id="description" name="description" rows="3">{{ department.description }}</textarea>
</div>
<button type="submit" class="btn btn-primary">保存</button>
</form>
</div>
</div>
{% endblock %}

depart_list.html
{% extends 'base.html' %}
{% block content %}
<div style="margin-top: 16px;">
<a class="btn btn-primary" href="{% url 'depart_add' %}">新增部门</a>
</div>
<div class="card mt-3">
<div class="card-header"> 部门列表</div>
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>部门名称</th>
<th>部门介绍</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for department in departments %}
<tr>
<td>
{{ department.name }}
</td>
<td>
{{ department.description }}
</td>
<td>
<a class="btn btn-primary btn-xs"
href="{% url 'depart_edit' pk=department.id %}">编辑</a>
<a class="btn btn-danger btn-xs"
href="{% url 'depart_delete' pk=department.id %}"
onclick="return confirm('确定要删除吗?')">删除</a>
</td>
</tr>
{% empty %}
<tr>
No departments found.
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}


Django4全栈进阶之路20 项目实战(三种方式开发部门管理):方式一:FBV的更多相关文章
- web前端全栈学习之路
web前端全栈学习之路 --- 陆续更新中 一.HTML相关 1.HTML常用标签:http://www.cnblogs.com/wyb666/p/8733699.html 2.HTML5基础: 3. ...
- 你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦
你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦
- C#.Net全栈工程师之路-学习路径
C#.Net全栈工程师之路-学习路径 按架构分: C/S架构: B/S架构: Mobile移动开发: 按技术点分: C#编程基础以及OOP面向对象编程: 数据库基础以及高级应用(MYSQL+MSSQL ...
- miniFTP项目实战三
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- GJM :用JIRA管理你的项目(三)基于LDAP用户管理 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- Eclipse导入SVN项目的三种方式
Eclipse导入SVN项目的三种方式 一.直接Import导入: 1.点击 File --> Import,进入导入项目窗口 2.选择从SVN检出项目,点击Next 3.选择创建新的资源库位置 ...
- 在Tomcat中部署web项目的三种方式
搬瓦工搭建SS教程 SSR免费节点:http://www.xiaokeli.me 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Man ...
- tomcat发布web项目的三种方式
tomcat发布web项目的三种方式 方式一: 配置tomcat 安装目录下的conf/server.xml <Host name="loaclhost">标签里面添加 ...
- 用Visual C++创建WPF项目的三种主要方法
用Visual C++创建WPF项目的三种主要方法 The problem with using XAML from C++ Because C++ doesn't support partial c ...
- 战争热诚的python全栈开发之路
从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...
随机推荐
- CSS clip-path 属性
属性定义及使用说明 clip-path 属性使用裁剪方式创建元素的可显示区域.区域内的部分显示,区域外的隐藏.可以指定一些特定形状. 注意: clip-path 属性将替换已弃用的 clip 属性. ...
- operator简介
原理 operator 是一种 kubernetes 的扩展形式,利用自定义资源对象(Custom Resource)来管理应用和组件,允许用户以 Kubernetes 的声明式 API 风格来管理应 ...
- 【读书笔记】排列研究-置换角度(分解为Products Of Cycles) 含GroupExploer使用
upd 2020-08-06 23:11完成了最初稿 目录 定义 开胃菜 entrée 群论角度 应用:几何变换 当然要从第一类斯特林数的角度来考虑一下 一个排列的type定义 排旗公式 应用-共轭排 ...
- Three.js 进阶之旅:物理效果-3D乒乓球小游戏 🏓
声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 摘要 本文在专栏上一篇内容<Three.js 进阶之旅:物理效果-碰撞和声 ...
- odoo 开发入门教程系列-安全-简介
安全-简介 前一章中我们已经创建了第一个打算用于存储业务数据的表.在odoo这样的一个商业应用中,第一个考虑的问题就是谁(Odoo 用户(或者组用户))可以访问数据.odoo为指定用户组用户提供了一个 ...
- java -- Stringbuild, Date, Calendar
Stringbuild类 由于String类的对象内容不可改变,每次拼接都会构建一个新的String对象,既耗时,又浪费内存空间 这时需要通过java提供的StringBuild类解决这个问题 Str ...
- Java面向对象--接口和多态
final 关键字 最终修饰符 可以修饰 类 方法 变量 被final修饰后不能被继承 重写 二次赋值 修饰类时 该类不可以被继承 修饰方法时 该方法不能被重写 修饰变量时, 该变量只能赋值一次, 不 ...
- 排队论——系统运行指标的R语言实现
排队是在日常生活中经常遇到的现象,如顾客到商店购买物品.病人到医院看病常常要排队.此时要求服务的数量超过服务机构(服务台.服务员等)的容量.也就是说,到达的顾客不能立即得到服务,因而出现了排队现象.这 ...
- 二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 (三主俩从)
二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 (三主俩从) Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可 ...
- 【FINALE】NOIP2022 退役记 || THE END.
我的停课生活相册 - password:1007 目录 Day -4 Day -2 Day -1 Day 1 2022/11/26 NOIP 2022 OI 浅忆录 Day -4 好冷啊.有了那么点冬 ...