تولید اسلاگ یکتا 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 و دسترسپذیری آدرسهای سایت کمک زیادی میکند. همچنین، با بررسی یکتایی اسلاگها در پایگاه داده، از برخورد اسلاگهای تکراری جلوگیری میشود.


















برای پروژههایی که چند زبان دارن، این روش مناسبه؟
بله تفاوتی ندارد.
تابع generate_unique_slug روی فیلدهای خالی هم کار میکنه؟
خیر کار نمیکند.
این تابع روی دیتابیسهای بزرگ بهینه هست؟
تفاوتی ندارد.
این روش برای همه مدلها جواب میده؟
بله امکانپذیراست.
میشه بدون unidecode هم کار کرد؟
بله ولی استفاده از آن باعث جلوگیری از خطا در زبانهای غیرلاتین میشود.