2013-07-15 10 views
5

Sfondo: Io uso django-hvad e ho un TranslatableModel. Nel suo TranslatedFields ho un attributo slug che dovrebbe essere creato automaticamente usando l'attributo title durante il salvataggio del modello.django-hvad - come devo impostare un valore di campo tradotto mentre si salva un'istanza di modello?

Problema: È difficile impostare il valore di uno degli TranslatedFields durante il salvataggio dell'istanza. Una soluzione che funziona è ignorare il metodo save_translations del mio TranslatableModel come segue. Solo la seconda ultima riga è diversa dall'originale:

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

Questa soluzione non è bello, perché fa uso di copia e incolla. C'è un modo migliore per ottenere lo stesso?

risposta

6

La seguente risposta presuppone che si stia utilizzando il sistema di gestione per generare automaticamente slug da title. Questa potrebbe o non potrebbe essere la tua esatta situazione ma potrebbe essere rilevante.

Questa è un'estensione di explanation all'interno delle pagine del progetto Django-hvad.

Il modo per implementare la tua funzione è all'interno del file admin.py all'interno della tua app. È necessario estendere il metodo __init__() della classe TranslatableAdmin.

Ad esempio, il modello è chiamato Entry. Il codice semplificato in models.py potrebbe essere sulla falsariga di quanto segue:

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

Il file corrispondente admin.py dovrebbe quindi essere il seguente:

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

Grazie, questa linea fissa un'incompatibilità tra pagliaio e Hvad, dove Hvad costringe l'oggetto da salvare nella interfaccia di amministrazione, e Haystack cerca di indicizzare immediatamente, prima che le traduzioni sono scritti. Preparare il valore usando 'self.lazy_translation_getter ('title')' ha funzionato per me. – qris

0

Django-Hvad 1.5.0.

Caso di utilizzo: impostazione del valore di un campo TranslatableModel all'esterno dell'amministratore di 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() 
Problemi correlati