2013-07-15 49 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

以下答案假設您使用管理系統從title自動生成slug。這可能是也可能不是你確切的情況,但它可能是相關的。

這是Django-hvad項目頁面中explanation的擴展。

實現您的功能的方法是在您的應用程序中的admin.py文件中。您需要擴展TranslatableAdmin類的__init__()方法。

舉個例子,你的模型叫做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

使用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() 
相關問題