首页 > 编程语言 >Django4全栈进阶之路23 项目实战(报修类型表):应用程序命名空间app_name和分页组件paginator

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

时间:2023-04-30 09:12:44浏览次数:50  
标签:paginator repair 进阶 form Django4 models import type name

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

 

标签:paginator,repair,进阶,form,Django4,models,import,type,name
From: https://www.cnblogs.com/beichengshiqiao/p/17364896.html

相关文章

  • Python之路【第十七篇】:Django【进阶篇】
    原博客笔记链接:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.Model到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:创建数据库,设计表结构和字段使用MySQLdb来连接数据库,并编写数据访问层代码业务逻辑层去调用数据访问层执行数......
  • [练习记录] 《算法竞赛进阶指南》打卡活动
    89.a^b题目大意给\(a,b,p\)求\(a^b\modp\)。思路可以直接快速幂。当模数\(p\)为\(1\)的时候特判一下。代码lla,b,mod;llqpow(lla,llb){ llres=1; while(b){ if(b&1)res=res*a%mod; a=a*a%mod,b>>=1; } returnres;}in......
  • VIVADO 进阶
    原则合适的代码风格精准的时序约束管理高扇出网络层次化设计结构处理跨时钟域设计少而精的物理约束选择实现策略共享控制信号读懂日志报告TCL作用代码风格  高扇出网络  高扇出网络几乎是限制FPGA设计实现更高性能的第一大障碍,所以......
  • Django4全栈进阶之路20 项目实战(三种方式开发部门管理):方式一:FBV
    1、模型fromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportUser#Createyourmodelshere.classDepartment(models.Model):name=models.CharField(max_length=255,verbose_name='部门名称')parent=models.ForeignKey('sel......
  • 【人工智能AI】五、NoSQL 应用实践《NoSQL 企业级基础入门与进阶实战》
    帮我写一篇介绍NoSQL的技术文章,文章的标题是《五、NoSQL应用实践》,不少于3000字。目录需要细化到三级目录,使用markdown格式。这篇文章的大的目录是:五、NoSQL应用实践5.1NoSQL实时数据分析5.2NoSQL分布式系统5.3NoSQL实时推荐系统5.4本章总结五、NoSQL应用实践NoSQL(N......
  • 第四节 CSS进阶
    day04-CSS进阶目标:掌握复合选择器作用和写法;使用background属性添加背景效果01-复合选择器定义:由两个或多个基础选择器,通过不同的方式组合而成。作用:更准确、更高效的选择目标元素(标签)。后代选择器后代选择器:选中某元素的后代元素。选择器写法:父选择器子选择器{CSS......
  • 【第31天】MYSQL进阶-写优化- 插入优化(SQL 小虚竹)
    回城传送–》《100天精通MYSQL从入门到就业》文章目录零、前言一、练习题目二、SQL思路:SQL进阶-写优化-插入优化解法插入优化禁用索引语法如下适用数据库引擎非空表:禁用索引禁用唯一性检查语法如下适用数据库引擎禁用外键检查语法如下适用数据库引擎批量插入数据语法如下适用数据库......
  • Kubernetes 1.3 从入门到进阶 安装篇:minikube
    Kubernetes单机运行环境一直是一个没有得到重视的问题。现在我们有了minikube,一个用go语言开发的可以在本地运行kubernetes的利器,不过目前应该只是支持kubernetes1.3。如果你只有一台机器或者虚拟机又想试验一下Kubernetes的新的功能,或者作kubernetes上开发的本地环境,minikube可能......
  • Day 28 28.2 JS进阶之eval和hook函数
    JS进阶之eval函数和hook函数【一】evaleval()函数计算JavaScript字符串,并把它作为脚本代码来执行。如果参数是一个表达式,eval()函数将执行表达式。如果参数是Javascript语句,eval()将执行Javascript语句。eval(string)//eval('[1,2,3,4,5].map(x=>x*x)')h......
  • Day 28 28.1 JS进阶之三元运算符
    JS工具之三元运算符【1】格式三元运算符:条件表达式?语句1:语句2;leta=10;letb=20;letd=a>b?a:bconsole.log(d);注释:条件运算符在执行时,首先对条件表达式进行求值,如果该值为true,则执行语句1,并返回执行结果如果该值为false,则......