首页 > 其他分享 >Django4全栈进阶之路20 项目实战(三种方式开发部门管理):方式一:FBV

Django4全栈进阶之路20 项目实战(三种方式开发部门管理):方式一:FBV

时间:2023-04-29 10:33:06浏览次数:37  
标签:depart 进阶 Django4 request return models 20 True name

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

 

 

标签:depart,进阶,Django4,request,return,models,20,True,name
From: https://www.cnblogs.com/beichengshiqiao/p/17363672.html

相关文章

  • 领先的矢量图形软件Ai2023(Illustrator 2023) Mac版
    Illustrator2023是专为计算机图形和结构设计,提供完整的可视化图形解决方案,并提供良好的效果和卓越的功能。它的可视化图形解决方案能够通过自动的矢量图形处理来创建美丽的建筑和结构。它提供一种简单且有效的方法来创建和编辑图形。→→↓↓载Illustrator2023Mac版 1.它......
  • [省选联考2023] 过河卒
    [省选联考2023]过河卒题目背景棋盘上有一个过河卒,需要走到底线。卒行走的规则是可以向左移动一格,向右移动一格或者向前移动一格。同时在棋盘上有两个另一方的棋子,需要拦截这个卒走到底线。这两个棋子的走法和帅一致,可以走到前后左右四个方向上相邻的格子。因此本题可以称为“......
  • NFO20003 数据库
    DatabaseSystemsINFO20003A2S12023Page1of7INFO20003Semester1,2023Assignment2:SQLDue:6:00pmFriday,28April2023Weighting:10%ofyourtotalassessmentResearchPapersDatabaseDescriptionYouandagroupoffellowundergradshavecreatedast......
  • 【愚公系列】2023年04月 .NET CORE工具案例-.NET Core使用MiniWord
    (文章目录)前言MiniWord模板引擎的主要功能是根据模板,生成对应的Word文档。支持跨平台,项目采用类似Vue、React模板方式,在模板定义相应的变量,再结合数据,快速生成Word文件。MiniWord官网:https://github.com/mini-software/MiniWord一、.NETCore使用MiniWord1.安装包MiniWord......
  • 2022年第一个线上问题,被领导骂惨了!
    hi大家好,我是田哥全职做面试辅导和技术支持的田哥。昨天,一位朋友说他们生产环境出bug了,哎,年底了,今年的年终奖估计凉凉了!这位朋友刚刚出道不久,出了问题,第一时间找的我。他把出问题的代码发我了,叫我帮他review这段代码。for(ProductOrderItemorderItem:orderItemList){if......
  • 2023/4/28读书笔记
       今天,上了计算机网络,学习了运输层的相关知识,简单介绍了UDP与TCP的协议与区别,一个可靠,一个尽可能交付,学习了端口与运输层为应用进程提供逻辑通信。后来,在概率论上学了了方差的定义,计算方法,常见方差,方差性质,标准差,标准化,协方差COV的定义,计算方法,性质,与相关系数。......
  • STM32单片机软件模拟I2C读取AM2320温湿度传感器数据
    STM32单片机使用软件模拟IIC读取AM2320温湿度传感器的数据并显示在0.96寸OLED屏上。我用的单片机是STM32F103C8T6,程序用的是ST标准库写的。STM32使用硬件I2C读取SHTC3温湿度传感器:https://blog.zeruns.tech/archives/692.htmlSTM32单片机读取AHT10温湿度传感器数据:https://blog.ze......
  • 总结20230428
    代码时间(包括上课):1h代码量(行):30行博客数量(篇):1篇相关事项:1、今天上午第一节课是计算机网络,开启了运输层的新篇章。2、今天上午第二节是概率论,讲的是概率论的方差、协方差、相关系数等知识。3、今天晚上打算在学一点Javaweb的知识。......
  • 2023冲刺清北营8
    T1内鬼由于两名内鬼的行动互不干扰,因此可以单独求解后暴力合并。很容易想到一种dp做法,设\(f_{i,S}\)表示当前位于第\(i\)个点,当前刀掉的人组成的集合为\(S\)时的最短时间,转移时考虑通过一条边或留在此处继续刀人,很容易使用Dijikstra进行转移,然而……它TLE了……考......
  • 每日总结2023-04-28
    今天完成了ANdroid中的找回密码packagecom.example.math;/**找回界面*/importstaticandroid.widget.Toast.LENGTH_SHORT;importandroidx.appcompat.app.AppCompatActivity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.view.View;import......