2012-11-29 4 views
1

J'ai un modèle Django qui inclut une balise modèle qui prend une variable (shop.id) et renvoie l'une des deux chaînes selon que le magasin est dans un modèle de base de données, comme ceciÉvaluation de la chaîne en tant que balise modèle - Django

{% is_shop_claimed shop.id %} 

les deux chaînes possibles retournées par l'étiquette de modèle sont

return '<p>Taken</p>' 

ou

return '<a href="/claim_shop/{{shop.id}}/">Claim shop now</a>' 

Lorsque le code est exécuté, si la deuxième chaîne est retournée, il apparaît dans le modèle (voir le code source de la page dans le navigateur) comme

<a href="/claim_shop/{{shop.id}}/">Claim shop now</a> 

et apparaît dans le navigateur comme un lien comme celui-ci

magasin de réclamation maintenant

le problème est que shop.id dans le href est pas évalué à un certain nombre par le moteur de template Django.

Le lien doit apparaître comme celui-ci pour le magasin 123, par exemple

<a href="/claim_shop/123/">Claim shop now</a> 

J'ai vérifié les documents de Django pour filtres à appliquer à la chaîne dans la balise de modèle ou dans le modèle afin que la chaîne est pas échappé mais pas de chance.

J'ai regardé this mais il semble qu'il devrait y avoir une manière simple de faire évaluer {{shop.id}} dans le modèle.

J'ai aussi fait l'étiquette de modèle pour renvoyer un Bool au lieu des deux cordes, laissant la présentation dans le modèle que je préférerais, mais en utilisant une instruction if autour d'une étiquette de modèle comme celui-ci

{% if is_shop_claimed shop.id %} 
    <p>Taken</p> 
{% elif not is_shop_claimed shop.id %} 
    <a href="/claim_shop/{{shop.id}}/">Claim shop now</a> 
{% endif %} 

ne fonctionne pas car je ne peux pas mettre la balise template dans l'instruction if.

Des suggestions sur comment obtenir {{shop.id}} à évaluer à un nombre? Toute aide serait appréciée. J'apprends Django et Python et j'ai passé des heures sur ce problème.

Répondre

2

Vous être transmis la valeur, donc juste le remplacer dans

return '<a href="/claim_shop/%s/">Claim shop now</a>' % (shop_id,) # or however you refer to it in the code 
+0

Merci @Ingacio Cela a fonctionné et c'était si facile, j'ai raté la solution simple! ;) – paulvs

0

Je vous suggère d'ajouter une propriété is_claimed vous magasinez modèle:.

class Shop(models.model): 

    # you fields are here 

    @property 
    def is_claimed(self): 
     # logik for determining if the shop is claimed 
     if claimed: 
      return True 
     else: 
      return False 

Ensuite, vous pouvez utiliser est en vous modèle:

{% if shop.is_claimed %} 
    <p>Taken</p> 
{% else %} 
    <a href="/claim_shop/{{shop.id}}/">Claim shop now</a> 
{% endif %} 

Vous pouvez même déplacer ceci à un extrait que vous pouvez inclure en tant que besoin ou (pour aller encore plus loin) créez un inclusion tag pour cela.

+0

Merci beaucoup pour l'excellente idée, je vais l'essayer! – paulvs

+0

Je n'ai pas essayé cette solution parce que @ Ignacio est beaucoup plus simple, mais merci encore pour la réponse, et peut-être que cette solution sera pratique pour quelqu'un d'autre. – paulvs

Questions connexes