Quản lý Loại Báo Cứu Trong Django 4: Không Gian Tên Ứng Dụng Và Phân Trang

1. Không gian tên ứng dụng app_name


from django.urls import path
from .views import CreateRepairType, UpdateRepairType, DeleteRepairType, RepairTypeListView

namespace_app = 'maintenance'

urlpatterns = [
    path('repair_types/', RepairTypeListView.as_view(), name='list_repair_type'),
    path('repair_types/new/', CreateRepairType.as_view(), name='create_repair_type'),
    path('repair_types//edit/', UpdateRepairType.as_view(), name='update_repair_type'),
    path('repair_types//remove/', DeleteRepairType.as_view(), name='delete_repair_type'),
]

2. Mô hình


from django.db import models
from BaseApp.models import Department
from HRApp.models import Employee
from MyProject import settings


class MaintenanceType(models.Model):
    department_ref = models.ForeignKey(Department, verbose_name="Bộ phận", on_delete=models.CASCADE, related_name='mt_department')
    title = models.CharField(verbose_name="Tên loại", max_length=100)
    parent_type = models.ForeignKey('self', verbose_name="Loại cha", null=True, blank=True, on_delete=models.CASCADE, related_name='mt_parent')
    creator = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name="Tài khoản tạo", on_delete=models.CASCADE, related_name='mt_creator')
    created_time = models.DateTimeField("Ngày tạo", auto_now_add=True)
    updater = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name="Tài khoản cập nhật", on_delete=models.CASCADE, related_name='mt_updater')
    updated_time = models.DateTimeField("Ngày cập nhật", auto_now=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "Loại bảo trì"
        verbose_name_plural = "Loại bảo trì"
        ordering = ['department_ref', 'title']

3. Biểu mẫu


from django import forms
from .models import MaintenanceType, Department


class MaintenanceTypeForm(forms.ModelForm):
    class Meta:
        model = MaintenanceType
        fields = ['title', 'parent_type', 'department_ref']
        parent_type = forms.ModelChoiceField(queryset=MaintenanceType.objects.all().order_by('title'), required=False)

4. Mẫu giao diện

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">Danh sách loại bảo trì</h3>
            <a href="{% url 'maintenance:create_repair_type' %}" class="btn btn-primary mb-2">Thêm mới</a>
            <div class="table-responsive">
                <table class="table table-striped table-hover">
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>Bộ phận</th>
                            <th>Tên loại</th>
                            <th>Loại cha</th>
                            <th>Hành động</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for repair in repairs %}
                        <tr>
                            <td>{{ repair.id }}</td>
                            <td>{{ repair.department_ref }}</td>
                            <td>{{ repair.title }}</td>
                            <td>{{ repair.parent_type.title }}</td>
                            <td>
                                <a href="{% url 'maintenance:update_repair_type' repair.id %}" class="btn btn-success btn-sm">Sửa</a>
                                <a href="{% url 'maintenance:delete_repair_type' repair.id %}" class="btn btn-danger btn-sm">Xóa</a>
                            </td>
                        </tr>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
            <nav aria-label="Phân trang">
                <ul class="pagination">
                    {% if page_obj.has_previous %}
                    <li><a href="{% url 'maintenance:list_repair_type' %}?page={{ page_obj.previous_page_number }}">Trước</a></li>
                    {% else %}
                    <li class="disabled"><a href="#">Trước</a></li>
                    {% endif %}
                    {% for page in paginator.page_range %}
                    {% if page == page_obj.number %}
                    <li class="active"><a href="{% url 'maintenance:list_repair_type' %}?page={{ page }}">{{ page }}</a></li>
                    {% else %}
                    <li><a href="{% url 'maintenance:list_repair_type' %}?page={{ page }}">{{ page }}</a></li>
                    {% endif %}
                    {% endfor %}
                    {% if page_obj.has_next %}
                    <li><a href="{% url 'maintenance:list_repair_type' %}?page={{ page_obj.next_page_number }}">Sau</a></li>
                    {% else %}
                    <li class="disabled"><a href="#">Sau</a></li>
                    {% endif %}
                </ul>
            </nav>
        </div>
    </div>
</div>
{% endblock %}

create.html

{% block content %}
{% include 'maintenance/repair_type/form.html' with form=form button_text='Lưu' form_title="Thêm loại bảo trì" %}
{% endblock %}

edit.html

{% block content %}
{% include 'maintenance/repair_type/form.html' with form=form button_text='Cập nhật' form_title="Sửa loại bảo trì" %}
{% 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.title.id_for_label }}">Tên loại:</label>
                {{ form.title|attr:"class:form-control" }}
            </div>
            <div class="form-group">
                <label for="{{ form.parent_type.id_for_label }}">Loại cha:</label>
                {{ form.parent_type|attr:"class:form-control" }}
            </div>
            <div class="form-group">
                <label for="{{ form.department_ref.id_for_label }}">Bộ phận trách nhiệm:</label>
                {{ form.department_ref|attr:"class:form-control" }}
            </div>
            <button type="submit" class="btn btn-primary">{{ button_text }}</button>
            <a href="{% url 'maintenance:list_repair_type' %}" class="btn btn-secondary mr-2">
                <i class="fas fa-arrow-left"></i> Quay lại
            </a>
        </form>
    </div>
</div>
{% endblock %}

confirm_delete.html

{% block content %}
<div class="container">
    <div class="row">
        <div class="col-md-12">
            <h1>Xóa loại bảo trì</h1>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <p>Bạn có chắc chắn muốn xóa "{{ object }}" không?</p>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <form method="post">
                {% csrf_token %}
                <div class="modal-footer">
                    <a href="{% url 'maintenance:list_repair_type' %}" class="btn btn-secondary">Hủy bỏ</a>
                    <button type="submit" class="btn btn-danger">Xóa</button>
                </div>
            </form>
        </div>
    </div>
</div>
{% endblock %}

Thẻ: Django python WebDevelopment pagination ModelView

Đăng vào ngày 16 tháng 7 lúc 02:34