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

发布时间 2023-04-30 08:46:13作者: 城南城南

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