1、应用程序命名空间app_name

from django.urls import path
from . import views
from .views import RepairDetailView app_name = 'repair' urlpatterns = [
path('repair_types/', views.RepairTypeListView.as_view(), name='repair_type_list'),
path('repair_types/create/', views.RepairTypeCreateView.as_view(), name='repair_type_create'),
path('repair_types/<int:pk>/update/', views.RepairTypeUpdateView.as_view(), name='repair_type_update'),
path('repair_types/<int:pk>/delete/', views.RepairTypeDeleteView.as_view(), name='repair_type_delete'),]

2、模型

from django.db import models
from BaseApp.models import Department
from HRApp.models import Employee
from MyProject import settings
import uuid class RepairType(models.Model):
department = models.ForeignKey(Department, verbose_name="部门", on_delete=models.CASCADE, to_field='id',
related_name='RepairType_department')
name = models.CharField(verbose_name="类型", max_length=100)
parent = models.ForeignKey('self', verbose_name="父级", null=True, blank=True, on_delete=models.CASCADE,
related_name='RepairType_parent')
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name="创建账户", on_delete=models.CASCADE,
related_name='repair_types_created')
created_at = models.DateTimeField("创建时间", auto_now_add=True)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name="修改账户", on_delete=models.CASCADE,
related_name='repair_types_update')
updated_at = models.DateTimeField("修改时间", auto_now=True) def __str__(self):
return self.name class Meta:
verbose_name = "报修类型"
verbose_name_plural = "报修类型"
ordering = ['department', 'name']

3、表单

from django import forms
from .models import Department, RepairType, Repair class RepairTypeForm(forms.ModelForm):
class Meta:
model = RepairType
# fields = '__all__'
fields = ['name', 'parent', 'department']
parent = forms.ModelChoiceField(queryset=RepairType.objects.all().order_by('name'), required=False)

4、模板

list.html

{% extends 'base.html' %}

{% block content %}
<div class="container-fluid mt-3">
<div class="row">
<div class="col-md-12">
<h3 class="mb-3">维修类型列表</h3>
<a href="{% url 'repair:repair_type_create' %}" class="btn btn-primary mb-2">新增</a>
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>序号</th>
<th>归属部门</th>
<th>类型名称</th>
<th>类型父级</th>
{# <th>创建账号</th>#}
{# <th>创建时间</th>#}
{# <th>修改账号</th>#}
{# <th>最后修改时间</th>#}
<th>操作</th>
</tr>
</thead>
<tbody>
{% for repair_type in repair_types %}
<tr>
<td>{{ repair_type.id }}</td>
<td>{{ repair_type.department }}</td>
<td>{{ repair_type.name }}</td>
<td>{{ repair_type.parent.name }}</td>
{# <td>{{ repair_type.created_by }}</td>#}
{# <td>{{ repair_type.created_time }}</td>#}
{# <td>{{ repair_type.modified_by }}</td>#}
{# <td>{{ repair_type.modified_time }}</td>#}
<td>
<a href="{% url 'repair:repair_type_update' repair_type.id %}"
class="btn btn-success btn-sm">编辑</a>
<a href="{% url 'repair:repair_type_delete' repair_type.id %}"
class="btn btn-danger btn-sm">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<nav aria-label="Page navigation">
<ul>
{% for article in articles %}
<li>
{{ article.title }}
</li>
{% endfor %}
</ul>
<ul class="pagination">
<!--#上一页-->
<!--当有上一页时-->
{% if page_obj.has_previous %}
<li><a href="{% url 'repair:repair_type_list' %}?page={{ page_obj.previous_page_number }}">上一页</a>
</li>
{% else %}
<li class="disabled"><a href="javascript:void(0)">上一页</a></li>
{% endif %} <!--中间的页码,如果是当前页,添加active属性--> {% for page in paginator.page_range %}
{% if page == page_obj.number %}
<li class="active">
<a href="{% url 'repair:repair_type_list' %}?page={{ page }}">{{ page }}</a>
</li>
{% else %}
<li><a href="{% url 'repair:repair_type_list' %}?page={{ page }}">{{ page }}</a></li>
{% endif %}
{% endfor %} <!--#下一页-->
{% if page_obj.has_next %}
<li>
<a href="{% url 'repair:repair_type_list' %}?page={{ page_obj.next_page_number }}">下一页</a>
</li>
{% else %}
<li class="disabled"><a href="javascript:void(0)">下一页</a></li>
{% endif %}
</ul>
</nav>
            </div>
</div>
</div>
{% endblock %}

create.html

{% block content %}
{% include 'repair/repair_type/form.html' with form=form button_text='新增' form_title="新增报修类型" %}
{% endblock %}

edit.html

{% block content %}
{% include 'repair/repair_type/form.html' with form=form button_text='保存' form_title='编辑报修类型' %}
{% endblock %}

form.html

{% extends 'base.html' %}
{% load widget_tweaks %}
{% block content %}
<div class="card mt-3">
<div class="card-header">
{{ form_title }}
</div>
<div class="card-body">
<form method="post">
{% csrf_token %}
<div class="form-group">
<label for="{{ form.name.id_for_label }}">类型名称:</label>
{{ form.name|attr:"class:form-control" }}
</div>
<div class="form-group">
<label for="{{ form.parent.id_for_label }}">父级部门:</label>
{{ form.parent|attr:"class:form-control" }}
</div>
<div class="form-group">
<label for="{{ form.department.id_for_label }}">责任部门:</label>
{{ form.department|attr:"class:form-control" }}
</div>
<button type="submit" class="btn btn-primary"> {{ button_text }}</button>
<a href="{% url 'repair:repair_type_list' %}" class="btn btn-secondary mr-2">
<i class="fas fa-arrow-left"></i> 返回
</a>
</form>
</div>
</div>
{% endblock %}

confirm_delete.html

{% block content %}
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Delete Repair Type</h1>
</div>
</div>
<div class="row">
<div class="col-md-12">
<p>Are you sure you want to delete "{{ object }}"?</p>
</div>
</div>
<div class="row">
<div class="col-md-12">
<form method="post">
{% csrf_token %}
<div class="modal-footer">
<a href="{% url 'repair:repair_type_list' %}" class="btn btn-secondary">Cancel</a>
<button type="submit" class="btn btn-danger">Delete</button>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

Django4全栈进阶之路23 项目实战(报修类型表):应用程序命名空间app_name和分页组件paginator的更多相关文章

  1. web前端全栈学习之路

    web前端全栈学习之路 --- 陆续更新中 一.HTML相关 1.HTML常用标签:http://www.cnblogs.com/wyb666/p/8733699.html 2.HTML5基础: 3. ...

  2. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  3. 你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦

    你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦

  4. C#.Net全栈工程师之路-学习路径

    C#.Net全栈工程师之路-学习路径 按架构分: C/S架构: B/S架构: Mobile移动开发: 按技术点分: C#编程基础以及OOP面向对象编程: 数据库基础以及高级应用(MYSQL+MSSQL ...

  5. Scala进阶之路-Scala中的高级类型

    Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...

  6. “全栈2019”Java第四章:创建第一个Java程序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. 战争热诚的python全栈开发之路

    从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...

  8. Python全栈开发之路 【第四篇】:Python基础之函数

    本节内容 函数def: 1.位置参数,默认参数 2.位置参数,关键参数 3.如果参数中出现 *users,传递的参数就可以不再是固定的个数, 传过来的所有元素进行打包成元组 *args,**kwarg ...

  9. Python全栈开发之路 【第一篇】:Python 介绍

    本节内容 一.Python介绍 python的创始人为荷兰人——吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本 ...

  10. Python全栈开发之路 【第七篇】:面向对象编程设计与开发(1)

    本节内容 一.编程范式 编程指的是写程序.敲代码,就是指程序员用特定的语法.数据结构和算法编写的代码,目的是来告诉计算机如何执行任务的. 在编程的世界里最常见的两大流派是:面向过程与面向对象.“功夫的 ...

随机推荐

  1. MySQL学习(十三)InnoDB

    参考博客: https://my.oschina.net/wangzemin/blog/5346534 InnoDB之BufferPool https://juejin.cn/post/7007421 ...

  2. 2.错误代码C2440

    错误 C2440 "初始化": 无法从"const char [5]"转换为"char *" 从整型强制转换为指针类型要求 reinterp ...

  3. 翟佳:StreamNative 组织构建之路丨声网开发者创业讲堂 • 第 5 期

    前言 翟佳,StreamNative 联合创始⼈,Apache Pulsar PMC 成员与 Committer.之前任职于 EMC,担任统⼀存储部⻔技术负责⼈. 在声网开发者创业讲堂 • 第 5 期 ...

  4. salesforce零基础学习(一百二十五)零基础学习SF路径

    本篇参考: https://boulder-bard-27f.notion.site/Salesforce-Learning-e990864695674f07b99a5f8955770bd4 本篇背景 ...

  5. CSAPP-Shell Lab

    提供的工具: parseline:获取参数列表char **argv,返回是否为后台运行命令(true). clearjob:清除job结构. initjobs:初始化jobs链表. maxjid:返 ...

  6. flutter---->阿里云oss的插件

    目前为止,阿里云官方并没有dart版本的oss sdk,所以才开发了这个插件flutter_oss_aliyun提供对oss sdk的支持. flutter_oss_aliyun 一个访问阿里云oss ...

  7. kubernetes 安装 Prometheus + Grafana

    kubernetes 安装 Prometheus + Grafana kubernetes install Prometheus + Grafana 官网 Official website https ...

  8. 动态规划DP入门问题----最大连续子序列,最长不下降子序列(可以不连续),最长公共子序列

    一.最大连续子序列 1.题目叙述 对于一个数字序列A1A2A3...An,求出连续子序列的最大和,如对于序列-2,11,-4,13,-5,-2,其中的最大序列和是11+(-4)+13=20 2.动态规 ...

  9. AI测试101:测试AI系统的实用技巧&ML和AI自动化工具

    基于人工智能的系统,也称为神经网络(NN Neural Networks),和其他应用程序一样是 "系统",因此需要测试.本文将指导你测试AI和基于NN的系统,并理解相关概念. 测 ...

  10. 做个清醒的程序员之拥抱AI

    阅读时长约 13 分钟,共计约 3100个字. 昨天我体验了AI自动生成短视频,具体说来,首先我在域名为FreeGPT的免费网站,向它提问,然后生成一段文字.之后呢,再用剪映里面的"图文成片 ...