2013-07-15 4 views
5

背景:私はdjango-hvadを使用し、TranslatableModelを持っています。そのTranslatedFieldsにはslug属性があります。この属性は、モデルを保存するときにtitle属性を使用して自動的に作成される必要があります。django-hvad - モデルインスタンスを保存する際に変換されたフィールド値を設定する方法は?

問題:インスタンスを保存中に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() 

このソリューションは、素敵ではありません。同じことを達成するより良い方法はありますか?

答えて

6

次の回答は、管理システムを使用してslugtitleから自動生成することを前提としています。これはあなたの正確な状況かもしれないし、そうでないかもしれませんが、それは関連しているかもしれません。

これは、Django-hvadプロジェクトページ内のexplanationの拡張です。

あなたの機能を実装する方法は、アプリ内のadmin.pyファイル内にあります。 メソッドを拡張して、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') 

次のようにあなたの対応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) 
+0

おかげで、この行はHvadは、管理インターフェイスに保存するオブジェクトを強制的に、そして翻訳が書き込まれる前にヘイスタックは、すぐにインデックスにそれをしようとヘイスタックとHvad間の非互換性を、固定。 'self.lazy_translation_getter( 'title')'を使って値を準備することは、私にとってはうまくいきました。 – qris

0

ジャンゴ-hvad 1.5.0を使用しました。

使用例:TranslatableModelフィールドの値をDjango管理外に設定します。

# 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() 
関連する問題