保存已翻译的 Django 模型翻译块不起作用
Saving translated slug of django modeltranslation not working
我已经为这个问题烦恼了一天了。
我使用 django-modeltranslation 来翻译 blog-like 个帖子。一切正常,除了我还尝试自动翻译标题中的 slug,基于这篇文章:https://raphaelbeck.wordpress.com/2011/04/16/how-to-translate-slug-with-django-modeltranslation/
只有翻译的slug没有翻译保存到数据库。
class Item(models.Model):
category = models.ForeignKey(
'help.category',
on_delete=models.PROTECT,
related_name='categories')
title = models.CharField(_('Titel'),max_length=255)
description = RichTextField(_('Omschrijving'))
slug = AutoSlugField(_('slug'), populate_from='title', overwrite=True)
class Meta:
verbose_name = _(u"Item")
verbose_name_plural = _(u"Items")
#automatically creating slugs for translations
def save(self, *args, **kwargs):
for lang_code, lang_verbose in settings.LANGUAGES:
if hasattr(self, 'slug_%s' % lang_code) and hasattr(self, 'title_%s' % lang_code):
setattr(self, 'slug_%s' % lang_code, slugify(getattr(self, 'title_%s' % lang_code, u"")))
print(self.slug_nl)
print(self.slug_en)
print(self.slug_nl)
print(self.slug_en)
super().save(*args, **kwargs)
def __str__(self):
return str(self.title)
我添加了一些打印功能以查看实际发生的情况。控制台日志符合预期:
dutch-slug
None
dutch-slug
english-slug
dutch-slug
english-slug
-> slug_en 根据控制台中的标题正确翻译,但在数据库中保存了荷兰语。
提前致谢!非常感谢任何想法。
django-model-translation 和 AutoSlugField
在 save()
方法中执行他们需要做的事情,所以你在保存之前所做的事情稍后会被覆盖。
除了添加翻译 post-save,别无他法,即使这意味着将模型保存两次。此外,您不能在 post_save 中调用 save()
,否则会创建无限递归。在查询集上使用 update()
。编写一个 post_save
信号处理程序:
@receiver(post_save, sender=Item)
def add_slug_translations(instance, **kwargs):
attrs = {}
for lang_code, lang_verbose in settings.LANGUAGES:
if hasattr(self, 'slug_%s' % lang_code) and hasattr(self, 'title_%s' % lang_code) and getattr(self, 'title_%s' % lang_code):
attrs.update({'slug_%s' % lang_code: slugify(getattr(self, 'title_%s' % lang_code, u"")})
if attrs:
Item.objects.filter(id=instance.id).update(**attrs)
我已经为这个问题烦恼了一天了。
我使用 django-modeltranslation 来翻译 blog-like 个帖子。一切正常,除了我还尝试自动翻译标题中的 slug,基于这篇文章:https://raphaelbeck.wordpress.com/2011/04/16/how-to-translate-slug-with-django-modeltranslation/
只有翻译的slug没有翻译保存到数据库。
class Item(models.Model):
category = models.ForeignKey(
'help.category',
on_delete=models.PROTECT,
related_name='categories')
title = models.CharField(_('Titel'),max_length=255)
description = RichTextField(_('Omschrijving'))
slug = AutoSlugField(_('slug'), populate_from='title', overwrite=True)
class Meta:
verbose_name = _(u"Item")
verbose_name_plural = _(u"Items")
#automatically creating slugs for translations
def save(self, *args, **kwargs):
for lang_code, lang_verbose in settings.LANGUAGES:
if hasattr(self, 'slug_%s' % lang_code) and hasattr(self, 'title_%s' % lang_code):
setattr(self, 'slug_%s' % lang_code, slugify(getattr(self, 'title_%s' % lang_code, u"")))
print(self.slug_nl)
print(self.slug_en)
print(self.slug_nl)
print(self.slug_en)
super().save(*args, **kwargs)
def __str__(self):
return str(self.title)
我添加了一些打印功能以查看实际发生的情况。控制台日志符合预期:
dutch-slug
None
dutch-slug
english-slug
dutch-slug
english-slug
-> slug_en 根据控制台中的标题正确翻译,但在数据库中保存了荷兰语。
提前致谢!非常感谢任何想法。
django-model-translation 和 AutoSlugField
在 save()
方法中执行他们需要做的事情,所以你在保存之前所做的事情稍后会被覆盖。
除了添加翻译 post-save,别无他法,即使这意味着将模型保存两次。此外,您不能在 post_save 中调用 save()
,否则会创建无限递归。在查询集上使用 update()
。编写一个 post_save
信号处理程序:
@receiver(post_save, sender=Item)
def add_slug_translations(instance, **kwargs):
attrs = {}
for lang_code, lang_verbose in settings.LANGUAGES:
if hasattr(self, 'slug_%s' % lang_code) and hasattr(self, 'title_%s' % lang_code) and getattr(self, 'title_%s' % lang_code):
attrs.update({'slug_%s' % lang_code: slugify(getattr(self, 'title_%s' % lang_code, u"")})
if attrs:
Item.objects.filter(id=instance.id).update(**attrs)