تولید اسلاگ یکتا unique در فارسی جنگو پایتون

تولید اسلاگ یکتا unique در فارسی جنگو پایتون
تولید اسلاگ یکتا unique در فارسی جنگو پایتون

تولید اسلاگ یکتا unique در فارسی جنگو پایتون

در بسیاری از پروژه‌های جنگو، نیاز داریم که یک مقدار خوانا و یکتا برای فیلدهای Slug که در مدل‌هایمان وجود دارد ایجاد کنیم. این مقدار معمولاً از فیلدهایی مانند عنوان یا نام گرفته می‌شود و به عنوان “اسلاگ” (slug) در بانک اطلاعاتی یا دیتابیس ذخیره می‌شود. اما وقتی داده‌های ما شامل کاراکترهای غیرلاتین باشند (مثلاً زبان فارسی، عربی، یا چینی و …)، ممکن است عملکرد عادی slugify در فریم ورک جنگو Django کافی نباشد. در این نوشته، نحوه‌ی تولید اسلاگ Slug یکتا را با پشتیبانی از زبان‌های غیرلاتین مثل فارسی بررسی می‌کنیم.

 

تولید اسلاگ یکتا unique در فارسی جنگو پایتون

مشکل اسلاگ در زبان‌های غیرلاتین

فریم ورک جنگو دارای تابع slugify است که رشته‌ها را به راحتی به فرمت اسلاگ تبدیل می‌کند. این تابع کاراکترهای خاص را حذف کرده و فاصله‌ها را به کاراکتر – (خط فاصله dash) تبدیل می‌کند. اما اگر رشته شامل کاراکترهای غیرلاتین (مثلا فارسی) باشد، خروجی ممکن است خالی یا ناقص باشد. برای حل این مشکل، می‌توان از کتابخانه‌ی unidecode در کنار تابع slugify استفاده کرد که متن را به معادل لاتین آن به سادگی تبدیل می‌کند.

 

پیاده‌سازی تولید اسلاگ یکتا

کد زیر یک تابع به نام generate_unique_slug پیاده‌سازی می‌کند که ابتدا مقدار ورودی را به لاتین تبدیل کرده و سپس اسلاگ Slug را تولید می‌کند. هم‌چنین بررسی می‌کند که اسلاگ Slug تولید شده در پایگاه داده و در آن مدل Model خاص تکراری نباشد و در صورت نیاز، یک عدد یکتا به انتهای آن اسلاگ Slug اضافه کند.

from django.utils.text import slugify
from unidecode import unidecode


def generate_unique_slug(instance, value, slug_field_name="slug"):
    """
    Generate a unique slug for a model instance, supporting non-Latin characters.

    Parameters:
    - instance: The model instance.
    - value: The value to generate the slug from (e.g., name, title).
    - slug_field_name: The name of the slug field on the model (default is 'slug').

    Returns:
    - A unique slug as a string.
    """
    transliterated_value = unidecode(value)
    slug = slugify(transliterated_value)
    unique_slug = slug
    num = 1
    model_class = instance.__class__

    while model_class.objects.filter(**{slug_field_name: unique_slug}).exists():
        unique_slug = f"{slug}-{num}"
        num += 1

    return unique_slug

 

نحوه استفاده از این تابع در مدل‌های جنگو Django

فرض کنید یک مدل BlogPost داریم که دارای فیلد title و slug است. می‌توانیم تابع generate_unique_slug را در متد save این مدل استفاده کنیم تا هنگام ذخیره‌ی داده، اسلاگ Slug یکتا ساخته شود:

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, blank=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = generate_unique_slug(self, self.title)
        super().save(*args, **kwargs)

با استفاده از این روش، می‌توانیم از عناوین غیرلاتین اسلاگ‌های خوانا و یکتایی Unique تولید کنیم. این کار به بهبود سئو SEO و دسترس‌پذیری آدرس‌های سایت کمک زیادی می‌کند. هم‌چنین، با بررسی یکتایی اسلاگ‌ها در پایگاه داده، از برخورد اسلاگ‌های تکراری جلوگیری می‌شود.

برای امتیاز به این نوشته کلیک کنید!
[کل: 2 میانگین: 5]