2013-07-15 14 views
5

Arka plan:django-hvad kullanıyorum ve TranslatableModel ürününe sahibim. TranslatedFields modelinde, slug özniteliğimde, model kaydedilirken title özniteliği kullanılarak otomatik olarak oluşturulmalıdır.django-hvad - Model örneğini kaydederken çevrilmiş alan değerini nasıl ayarlamalıyım?

Sorun: Örneği kaydederken TranslatedFields'un değerini ayarlamak zordur. Çalıştığı bir çözüm, TranslatableModel'un save_translations yöntemini aşağıdaki gibi geçersiz kılmaktır. Sadece ikinci son satırı orijinal farklıdır: kopyalama ve yapıştırma kullanır çünkü

@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() 

Bu çözüm, hoş değil. Aynı şeyi başarmanın daha iyi bir yolu var mı?

cevap

6

Aşağıdaki yanıt, title'dan slug otomatik oluşturmak için yönetim sistemini kullandığınızı varsayar. Bu sizin durumunuz olabilir veya olmayabilir, ancak ilgili olabilir.

Bu, Django-hvad proje sayfalarındaki explanation'un bir uzantısıdır.

Özelliğinizi gerçekleştirmenin yolu, uygulamanızın içindeki admin.py dosyasında. TranslatableAdmin sınıfının __init__() yöntemini genişletmeniz gerekir. Örneğin, modelinize Entry adı verilir. Örneğin, modelinize Entry adı verilir. models.py basitleştirilmiş kod aşağıdaki çizgisinde olabilir: şöyle

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') 

Kişisel tekabül admin.py dosya daha sonra olmalıdır:

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

sayesinde bu hat Hvad yönetici arayüzü kaydedilemeyecek nesneyi zorlar Haystack ve hvad arasında bir uyumsuzluk tespit ve Haystack indeksi çalışır hemen, çeviriler yazılır önce. 'Self.lazy_translation_getter ('title')' kullanarak değeri hazırlamak, benim için çalışmasını sağladı. – qris

0

django-hvad 1.5.0 kullanma.

Kullanım örneği: TransinteModel alanının değerini Django Yönetiminin dışına ayarlamak.

# 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() 
İlgili konular