Сохранение переведенного слага django, модель-перевод не работает - PullRequest
0 голосов
/ 24 января 2019

Я уже один день ломаю голову над этим.

Я использую 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)

Я добавил несколько функций печати, чтобы увидеть, что на самом деле происходит. Журналы консоли соответствуют ожидаемым:

нидерландский-пробкового

нет

нидерландский-слизняк

английский-слизняк

нидерландский-слизняк

английский-слизняк

-> slug_en переведен правильно на основе заголовка в консоли, но в базе данных сохранены голландские слизни.

Заранее спасибо! Любые идеи с благодарностью.

1 Ответ

0 голосов
/ 26 января 2019

django-model-translation и AutoSlugField выполняют то, что им нужно сделать во время метода save(), поэтому то, что вы делаете перед сохранением, перезаписывается позже.

Нет другого способа, кроме как добавить переводы после сохранения, даже если это означает сохранение модели дважды. Также вы не можете вызвать save() в post_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)
...