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

Phi*_*ler 5 django translation django-models 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()
Run Code Online (Sandbox Code Playgroud)

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

nic*_*ave 6

以下的答案必须假设您正在使用的管理系统自动生成slugtitle.这可能是您的确切情况,也可能不是,但它可能是相关的.

这是Django-hvad项目页面中解释的扩展.

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

比如说,你的模型被调用了Entry.简化的代码models.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')
Run Code Online (Sandbox Code Playgroud)

您的相应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)
Run Code Online (Sandbox Code Playgroud)