【问题标题】:django-hvad - how should I set a translated field value while saving a model instance?django-hvad - 我应该如何在保存模型实例时设置翻译的字段值?
【发布时间】:2013-07-15 15:26:21
【问题描述】:

背景:我使用django-hvad 并拥有TranslatableModel。在其TranslatedFields 中,我有一个slug 属性,应该在保存模型时使用title 属性自动创建。

问题:在保存实例时很难设置TranslatedFields 之一的值。一个可行的解决方案是覆盖我的TranslatableModelsave_translations 方法,如下所示。只有倒数第二行与原来的不同:

    @classmethod
    def save_translations(cls, instance, **kwargs):
        """
        The following is copied an pasted from the TranslatableModel class.
        """
        opts = cls._meta
        if hasattr(instance, opts.translations_cache):
            trans = getattr(instance, opts.translations_cache)
            if not trans.master_id:
                trans.master = instance
            # The following line is different from the original.
            trans.slug = defaultfilters.slugify(trans.title)
            trans.save()

这个解决方案不好,因为它使用了复制和粘贴。有没有更好的方法来达到同样的效果?

【问题讨论】:

    标签: django django-models translation django-hvad


    【解决方案1】:

    以下答案假设您使用管理系统从title 自动生成slug。这可能是也可能不是您的确切情况,但它可能是相关的。

    这是 Django-hvad 项目页面中 explanation 的扩展。

    实现您的功能的方法是在您的应用中的admin.py 文件中。您需要扩展TranslatableAdmin 类的__init__() 方法。

    例如,假设您的模型名为Entrymodels.py 中的简化代码如下:

    from django.db import models
    from hvad.models import TranslatableModel, TranslatedFields
    
    class Entry(TranslatableModel):
        translations = TranslatedFields(
            title=models.CharField(max_length=100,),
            slug=models.SlugField(),
            meta={'unique_together': [('language_code', 'slug')]},
        )
        def __unicode__(self):
            return self.lazy_translation_getter('title')
    

    您对应的admin.py 文件应如下所示:

    from django.contrib import admin
    
    from hvad.admin import TranslatableAdmin
    
    from .models import Entry
    
    class EntryAdmin(TranslatableAdmin):
        def __init__(self, *args, **kwargs):
            super(EntryAdmin, self).__init__(*args, **kwargs)
            self.prepopulated_fields = {'slug': ('title',)}
    
    admin.site.register(Entry, EntryAdmin)
    

    【讨论】:

    • 谢谢,这一行修复了 Haystack 和 Hvad 之间的不兼容问题,其中 Hvad 强制将对象保存在管理界面中,而 Haystack 会在编写翻译之前立即对其进行索引。使用 self.lazy_translation_getter('title') 准备值使它对我有用。
    【解决方案2】:

    使用 django-hvad 1.5.0。

    用例:在 Django Admin 之外设置 TranslatableModel 字段的值。

    # self is a TranslatableModel instance with `translations`
    # this first line will initialize the cache if necessary
    slug = self.lazy_translation_getter('slug')
    translation = get_cached_translation(self)
    translation.master = self
    translation.slug = defaultfilters.slugify(self.title)  # whatever value
    translation.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 2019-01-05
      • 2015-06-03
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多