2009-09-13 5 views
0

J'utilise google appengine (python, bien sûr :)) et je voudrais faire un string.replace sur une chaîne à partir du fichier modèle.Google appengine remplacement de la chaîne dans le fichier modèle

 
{% for item in items %} 
    <p>{{ item.code.replace('_', ' ') }}</p> 
{% endfor %} 

Mais cela ne fonctionne pas. Donc nous ne pouvons pas exécuter autre chose que des contrôles de base dans les modèles de moteur d'application. Est-ce exact ?


Un autre problème connexe est que j'essaie de raccourcir une chaîne et de la rendre disponible au modèle.

Chaque objet mobilier a un nom et un champ description plus long. Dans cette vue, je suis rendu, je veux seulement les 50 premiers caractères du champ description.

J'ai donc essayé quelque chose comme

 
items = db.GqlQuery('select * from furniture') 

# edit: if you change the above line to 
# items = db.GqlQuery('select * from furniture').fetch(1000) 
# the .fetch() command makes the addition of dynamic properties work! 

for item in items : 
    item.shortdescr = item.description[ 0:50 ] 

# pass data off to template for rendering 
self.response.out.write(
    template.render('furnitureAll.html', { 'items' : items }) 
) 

modèle va

 

{% for item in items %} 
    <p>{{ item.name }}</p> 
    <p>{{ item.shortdescr }}</p> 
    <!-- items.shortdescr does not exist here, 
    probably because I did not .put() it previously. --> 
{% endfor %} 

Depuis cela ne fonctionne pas, je l'ai essayé de changer gql requête pour raccourcir la chaîne à la place. Mais je réalise rapidement que Gql n'est pas comme SQL. Je suis en train d'écrire des requêtes telles que

 
select name,LEFT(description, 50) from furniture 

Avec peu de succès

Répondre

1

J'ai peu d'expérience avec Google AppEngine, mais je crois comprendre qu'il est très proche de Django. Vos modèles ne contiennent pas réellement de code Python, même si certaines structures que vous utilisez dans eux ressemblent à cela.

Les deux questions devraient être résolues en utilisant des filtres de gabarit. Si c'était Django, je voudrais utiliser quelque chose comme ça pour votre deuxième question:

{{ item.description|truncatewords:10 }} 

Pour votre première question (chaîne remplacer), il peut y avoir aucun filtre intégré vous pouvez utiliser pour cela. Vous devrez écrire le vôtre.Quelque chose comme ça;

from google.appengine.ext.webapp.template import create_template_register 

register = create_template_register() 

@register.filter 
def replace_underscores(strng): 
    return strng.replace('_', ' ') 

Ensuite, dans votre modèle, vous pouvez le faire:

{{ item.code|replace_underscores }} 
+0

Merci mec. ftr il semble qu'il devrait y avoir un deux-points entre truncatewords: arg ie. comme truncatewords: 10. – bobobobo

+0

Vous avez absolument raison - je l'ai édité pour résoudre ce problème –

1

Outre l'argument moins .fetch() appel dans votre code, que je crois ne peut éventuellement travailler (vous devez toujours passer un fetch argument - le nombre maximum d'entités que vous voulez récupérer!), je ne peux pas reproduire votre problème - assigner un nouvel attribut (y compris celui obtenu en traitant les existants) à chaque élément fonctionne bien dans mes tests.

Pouvez-vous s'il vous plaît reproduire votre problème observé dans la plus petite boussole possible et éditer votre question pour inclure tous les fichiers pertinents? Semble être la seule façon dont nous pourrions vous aider avec votre bug observé bizarre!

BTW, select name,LEFT(description, 50) ou tout NATURELLEMENT ne fonctionnera pas dans GQL - GQL, très très explicitement, ne supporte que select * pour obtenir des entités entières ou select __key__ pour obtenir seulement les clés entités - qui est tout; Pas de sélectivité des colonnes dans le select, et encore moins aucune opération sur eux! -)

+0

coupable. J'ai ajouté .fetch() sans test b/c il n'était pas là avant - fonctionne sans cela mais j'ai pensé que je devrais l'ajouter dans la version "officielle" de la question. – bobobobo

+0

Oh ouah! ajouter .fetch (100) rend l'addition de champs dynamiques fonctionnels! – bobobobo

+0

Sans le chargement vous n'avez pas (encore) de liste, vous avez une requête (itérable, mais pas une liste). Mais 'fetch' demande un argument (nombre maximal d'éléments à récupérer) pour renvoyer une liste. –

Questions connexes