django-hvad - 在保存模型实例时如何设置翻译的字段值?

时间:2013-07-15 15:26:21

标签: django django-models translation django-hvad

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

问题:保存实例时很难设置其中一个save_translations的值。可行的解决方案是覆盖TranslatableModel @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() 方法,如下所示。只有最后一行与原始行不同:

{{1}}

这个解决方案不太好,因为它使用了复制和粘贴。有没有更好的方法来实现同样的目标?

2 个答案:

答案 0 :(得分:6)

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

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

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

例如,假设您的模型名为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)

答案 1 :(得分:0)

使用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()