Django4全栈进阶之路23 项目实战(报修类型表):应用程序命名空间app_name和分页组件paginator
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的更多相关文章
- web前端全栈学习之路
web前端全栈学习之路 --- 陆续更新中 一.HTML相关 1.HTML常用标签:http://www.cnblogs.com/wyb666/p/8733699.html 2.HTML5基础: 3. ...
- python 全栈开发之路 day1
python 全栈开发之路 day1 本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...
- 你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦
你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦
- C#.Net全栈工程师之路-学习路径
C#.Net全栈工程师之路-学习路径 按架构分: C/S架构: B/S架构: Mobile移动开发: 按技术点分: C#编程基础以及OOP面向对象编程: 数据库基础以及高级应用(MYSQL+MSSQL ...
- Scala进阶之路-Scala中的高级类型
Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...
- “全栈2019”Java第四章:创建第一个Java程序
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 战争热诚的python全栈开发之路
从学习python开始,一直是自己摸索,但是时间不等人啊,所以自己为了节省时间,决定报个班系统学习,下面整理的文章都是自己学习后,认为重要的需要弄懂的知识点,做出链接,一方面是为了自己找的话方便,一方 ...
- Python全栈开发之路 【第四篇】:Python基础之函数
本节内容 函数def: 1.位置参数,默认参数 2.位置参数,关键参数 3.如果参数中出现 *users,传递的参数就可以不再是固定的个数, 传过来的所有元素进行打包成元组 *args,**kwarg ...
- Python全栈开发之路 【第一篇】:Python 介绍
本节内容 一.Python介绍 python的创始人为荷兰人——吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本 ...
- Python全栈开发之路 【第七篇】:面向对象编程设计与开发(1)
本节内容 一.编程范式 编程指的是写程序.敲代码,就是指程序员用特定的语法.数据结构和算法编写的代码,目的是来告诉计算机如何执行任务的. 在编程的世界里最常见的两大流派是:面向过程与面向对象.“功夫的 ...
随机推荐
- final修饰的作用
在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量) 1.final修饰类 当用final修饰一个类时,表明这个类不能被继承. final类中的成员变量可以根据需要设为f ...
- SublimeText实现Markdown快速预览
SublimeText是什么? SublimeText是一个文本编辑器,同时也是一个先进的代码编辑器.SublimeText具有漂亮的用户界面和强大的功能,它的主要功能包括:拼写检查,书签,完整的Py ...
- Android笔记--动态申请权限
动态申请权限 在动态申请权限这里,一共分为两种不同的模式,分别是Lazy模式(懒汉式)和Hungry模式(饿汉式),这两种模式区分的话,可以通俗地解释一下就是,对于懒汉来说,只有在我们点击某个按钮需要 ...
- Jetson Xavier NX 试玩 (一)
Jetson Xavier NX 试玩 (一) 环境搭建 0 前言 NVIDIA家的Jetson系列是业内嵌入式边缘计算机的代表作,体积小,功能强是其最主要的优点. 学院入手了一款Jeston Xav ...
- springboot格式化timestamp时间
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
- 第三部分:Spdlog 日志库的实现原理
! https://zhuanlan.zhihu.com/p/617432495 Spdlog 是一个快速.异步的 C++ 日志库,被广泛应用于 C++ 项目中.在这篇文章中,我们将探讨 Spdlog ...
- pandas之loc/iloc操作
在数据分析过程中,很多时候需要从数据表中提取出相应的数据,而这么做的前提是需要先"索引"出这一部分数据.虽然通过 Python 提供的索引操作符"[]"和属性操 ...
- day118:MoFang:根据激活/未激活的状态分别显示树桩&种植植物&解锁树桩&化肥/修剪/浇水/宠物粮小图标数字的显示
登录 1.根据激活状态和未激活状态分别显示树桩 2.用户使用植物道具进行果树种植 3.解锁树桩 4.化肥/修剪/浇水/宠物粮小图标显示 种植栏的功能实现 1. 客户端需要的植物相关参数: 总树桩数量, ...
- keycloak~时间不正确的问题
首先我们应该知道,写到数据库里的时间,主要和你的mysql时区system_time_zone有关,而把mysql里的数据取出来,以json形式响应到浏览器上,这个时间会经过反序列化的过程,这时时间和 ...
- YII2.0的文件上传, 并把文件名称重新编译
/** *@Action 文件上传示例 *@这里我们演示的是一个YII2.0的文件上传, 并把文件名称重新编译 *@我们上传的是一个叫 photo 的jpg和png格式的文件 */ Controlle ...