2010-08-11 4 views
4

Je construis un site qui fournira des informations sur les produits en deux langues: anglais et chinois."Le meilleur" moyen d'afficher conditionnellement les valeurs de différents champs de modèle dans les modèles Django?

Chaque produit doit avoir un nom anglais et peut également avoir un nom chinois.

Chaque fois qu'une page de produit est demandée, l'objet request est inspecté pour déterminer si le nom du produit doit être affiché en anglais ou en chinois. Dans ce dernier cas, le nom chinois doit être affiché s'il est défini, sinon le nom anglais doit être affiché.

Voici une version simplifiée de mon modèle Product avec des informations superflues supprimé:

class Product(models.Model): 
    english_name = models.CharField(max_length=100) 
    chinese_name = models.CharField(max_length=100, null=True, blank=True) 

    def name(self, language): 
     if language == 'Chinese' and self.chinese_name: 
      return self.chinese_name 
     else: 
      return self.english_name 

Ma question est quelle est la façon la plus propre à la sortie du nom de votre choix à partir d'un modèle? Il n'est pas possible d'appeler la méthode name car un argument language doit lui être passé, et les modèles Django ne prennent en charge que les appels de méthode sans argument.

Je pourrait tout en utilisant la logique dans le modèle, mais cela est loin d'être élégant:

{% ifequal language 'Chinese' %} 
    {% firstof product.chinese_name product.english_name %} 
{% else %} 
    {{ product.english_name }} 
{% endifequal %} 

je pourrais aussi écrire un filtre de modèle pour contenir la logique ci-dessus:

@register.filter 
def name(product, language): 
    if language == 'Chinese' and product.chinese_name: 
     return product.chinese_name 
    else: 
     return product.english_name 

Ce serait assez agréable à utiliser:

{{ product|name:language }} 

Créer un filtre de gabarit ferait le travail, mais pour moi cette logique appartient vraiment au modèle. L'approche du filtre modèle est-elle bonne ou existe-t-il un «meilleur» moyen d'obtenir le même résultat?

Je me rends compte que ma question est plutôt vague - j'ai quelques solutions de travail, mais j'aimerais savoir quelle est la meilleure solution (comme dans la «meilleure pratique») à ce problème.

Répondre

4

Que diriez-vous d'apporter une petite modification au filtre?

@register.filter 
def name(product, language): 
    return product.name(language) 

De cette façon, votre filtre ne fait qu'encapsuler l'appel; la logique est toujours traitée à l'intérieur du modèle. Juste une pensée.

+0

Ceci est une bonne approche et celle que j'utiliserais. –

+0

Très belle amélioration. Merci, Manoj. – davidchambers

Questions connexes