保存Django modeltranslation的翻译后段不起作用

时间:2019-01-24 13:45:25

标签: python django translation slug

我已经为此烦恼了一天。

我使用django-modeltranslation翻译类似博客的帖子。一切正常,除了根据本文:https://raphaelbeck.wordpress.com/2011/04/16/how-to-translate-slug-with-django-modeltranslation/

,我还尝试自动翻译标题中的子弹

仅翻译的子弹未翻译保存到数据库。

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)

我添加了一些打印功能,以查看实际发生的情况。控制台日志符合预期:

荷兰sl

没有

荷兰sl

英语sl

荷兰sl

英语sl

-> slug_en是根据控制台中的标题正确翻译的,但是在数据库中保存了荷兰。

提前谢谢!任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

django-model-translation和AutoSlugField执行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)