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 %}



浙公网安备 33010602011771号