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