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 %}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2022-04-29 SQL Server:User, group, or role 'iemis' already exists in the current database.
2022-04-29 SQL Server 2014 英文版安装教程