Tự động tạo Slug Django trong Adminpanel

1. Tệp app/models.py

class Brand(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)  # Slug thương hiệu
    ...
    def __str__(self):
        return self.title

2. Tệp app/admin.py

class BrandAdmin(admin.ModelAdmin):
    ...
    prepopulated_fields = {'slug': ('title',)}   # Chuyển tiêu đề sang slug
admin.site.register(Brand, BrandAdmin)

OK, slug được tạo tự động khi bạn gõ tiêu đề.

slug-django

3. Để hiển thị được tiếng việt không dấu như trên, Sửa tệp urlify.js, Xem tệp gốc ở đây

Trong trường hợp của tôi: \Python\Python39\Lib\site-packages\django\contrib\admin\static\admin\js

Thêm mã bên dưới vào trước const ALL_DOWNCODE_MAPS, đồng thời vô hiệu SERBIAN_MAP.
Tệp của bạn sẽ trông giống như sau:

// Chuyển tiếng việt có dấu sang không dấu
...
const VIETNAM_MAP = {
        'á': 'a', 'à': 'a', 'ạ': 'a', 'ả': 'a', 'ã': 'a', 'ă': 'a', 'ắ': 'a', 'ằ': 'a', 'ặ': 'a',
        'ẳ': 'a', 'ẵ': 'a', 'â': 'a', 'ấ': 'a', 'ầ': 'a', 'ậ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'Á': 'a',
        'À': 'a', 'Ạ': 'a', 'Ả': 'a', 'Ã': 'a', 'Ă': 'a', 'Ắ': 'a', 'Ằ': 'a', 'Ặ': 'a', 'Ẳ': 'a',
        'Ẵ': 'a', 'Â': 'a', 'Ấ': 'a', 'Ầ': 'a', 'Ậ': 'a', 'Ẩ': 'a', 'Ẫ': 'a',
        'đ': 'd', 'Đ': 'd',
        'è': 'e', 'é': 'e', 'ẻ': 'e', 'ẽ': 'e', 'ẹ': 'e',
        'ê': 'e', 'ề': 'e', 'ế': 'e', 'ể': 'e', 'ễ': 'e', 'ệ': 'e',
        'È': 'e', 'É': 'e', 'Ẻ': 'e', 'Ẽ': 'e', 'Ẹ': 'e',
        'Ê': 'e', 'Ề': 'e', 'Ế': 'e', 'Ể': 'e', 'Ễ': 'e', 'Ệ': 'e',
        'ì': 'i', 'í': 'i', 'ỉ': 'i', 'ĩ': 'i', 'ị': 'i',
        'Ì': 'i', 'Í': 'i', 'Ỉ': 'i', 'Ĩ': 'i', 'Ị': 'i',
        'ò': 'o', 'ó': 'o', 'ỏ': 'o', 'õ': 'o', 'ọ': 'o',
        'ô': 'o', 'ồ': 'o', 'ố': 'o', 'ổ': 'o', 'ỗ': 'o', 'ộ': 'o',
        'ơ': 'o', 'ờ': 'o', 'ớ': 'o', 'ở': 'o', 'ỡ': 'o', 'ợ': 'o',
        'Ò': 'o', 'Ó': 'o', 'Ỏ': 'o', 'Õ': 'o', 'Ọ': 'o',
        'Ô': 'o', 'Ồ': 'o', 'Ố': 'o', 'Ổ': 'o', 'Ỗ': 'o', 'Ộ': 'o',
        'Ơ': 'o', 'Ờ': 'o', 'Ớ': 'o', 'Ở': 'o', 'Ỡ': 'o', 'Ợ': 'o',
        'ù': 'u', 'ú': 'u', 'ủ': 'u', 'ũ': 'u', 'ụ': 'u',
        'ư': 'u', 'ừ': 'u', 'ứ': 'u', 'ử': 'u', 'ữ': 'u', 'ự': 'u',
        'Ù': 'u', 'Ú': 'u', 'Ủ': 'u', 'Ũ': 'u', 'Ụ': 'u',
        'Ư': 'u', 'Ừ': 'u', 'Ứ': 'u', 'Ử': 'u', 'Ữ': 'u', 'Ự': 'u',
        'ỳ': 'y', 'ý': 'y', 'ỷ': 'y', 'ỹ': 'y', 'ỵ': 'y',
        'Y': 'y', 'Ỳ': 'y', 'Ý': 'y', 'Ỷ': 'y', 'Ỹ': 'y', 'Ỵ': 'y'
    };
    const ALL_DOWNCODE_MAPS = [
        VIETNAM_MAP,   // <-- Thêm vào
        ...
        // SERBIAN_MAP,  // Vô hiệu hoặc xóa dòng này
        ...