Django slug 字段不适用于除英语之外的任何其他语言。我想使用孟加拉语工作 这是代码
class Post(models.Model):
title = models.CharField(max_length=140)
category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)
content = RichTextField(default="")
image = models.ImageField(upload_to="media/post")
url = models.SlugField(unique=True, max_length=250, null=True, blank=True)
likes = models.IntegerField(default=0)
created_date = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.title}"
def save(self, *args, **kwargs): # new
if not self.url:
slug_str = f"{self.title}-{datetime.datetime.now()}"
self.url = slugify(slug_str)
return super().save(*args, **kwargs)
将 allow_unicode=True 传递给您的
SlugField
以接受 unicode 字符
class Post(models.Model):
...
url = models.SlugField(allow_unicode=True, unique=True, max_length=250, null=True, blank=True)
然后,当您生成 slug 时,您需要 将相同的参数传递给
django.utils.text.slugify
def save(self, *args, **kwargs): # new
if not self.url:
slug_str = f"{self.title}-{datetime.datetime.now()}"
self.url = slugify(slug_str, allow_unicode=True)
return super().save(*args, **kwargs)
这是我如何在我的一个项目中完成此操作的示例。
标题:স্পেনেরমাদ্রিদেবাংলাপ্রেসক্লাবেরদ্বি বার্ষিকসম্মেলন
您可以使用 SlugField 并允许 unicode,但您将得到 slug:সপনর-মদরদ-বল-পরসকলবর-দববরষক-সমমলন
让我们解决这个问题:
slug = models.CharField(
max_length=200,
unique=True, blank=True, null=True, editable=True
)
def save(self,*args, **kwargs):
if not self.slug:
self.slug = self.title.replace(" ", "-").replace(",", "")
return super(BanglaModel, self).save(*args, **kwargs)
输出段:স্পেনের-মাদ্রিদে-বাংলা-প্রেসক্লাবের-দ্ব িবার্ষিক-সম্মেলন
django.utils.text.slugify এর সমাস্যা হচ্ছে, সে বাংলা ফন্টের আকার ইকার সব ফেলে দেয়।
এভাবেকরতেপারেনঃ def save ফাংশনেরদ্বাড়াস্পেসওক মা গুলো রিপ্লেস করে দিবেন। আর বাংলা ফন্টের জন্য ফিল্ডের ইউনিকোড ট্রু করে দিবেন। max_length=150 কার আপার টাইটেল 140, এডমিন থেকে টেষ্ট করতে গেল ে ঝামেলা এড়াতে null=True,空白=True করে দিলাম,URL কিন্তু unique=True তো রাখতে ইহবে।
আমি ইমেজ ফরমেট webp কনভার্টসহ দিয়ে দিলাম, কারন এটা এখন লাগেই। কভার্ট করতে PIL ও BytesIO ইমপোর্ট করতে হবে।
from PIL import Image
from io import BytesIO
class Post(models.Model):
title = models.CharField(max_length=140)
category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)
content = RichTextField(default="")
image = models.ImageField(upload_to="media/post")
url = url = models.SlugField(allow_unicode=True, unique=True, max_length=150, null=True, blank=True)
likes = models.IntegerField(default=0)
created_date = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.title}"
def save(self, *args, **kwargs):
if not self.url:
slug_str = f"{self.title}"
self.url = self.title.replace(" ", "-").replace(",", "")
return super().save(*args, **kwargs)
if self.image:
img = Image.open(self.image)
output = BytesIO()
img.convert('RGB').save(output, format='webp', maxsize=(800, 800))
self.image = InMemoryUploadedFile(output,'ImageField', "%s.webp" %self.image.name.split('.')[0], 'media/post', output.getvalue(), None)
super(Post, self).save(*args, **kwargs)