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