2010-11-22 4 views
0

MISE À JOUR 1 AJOUTÉE CODE MISE À JOURAppengine Django modèle - Lire les balises de modèle

J'ai un modèle de django sur le moteur d'application. Actuellement, toutes mes données sont dans plusieurs modèles et je voudrais lire les modèles sur le disque. Très facile, mais je voudrais obtenir les valeurs de ces modèles dans AppEngine.

par ex. fichier: p1.html

{%block price%}$259{%endblock%} 
{%block buy%}http://www.highbeam.co.nz/store/index.php?route=product/product&path=6&product_id=116{%endblock%} 
{%block info%}http://www.inov-8.co.nz/oroc280.html{%endblock%}  

Puis-je charger et lire ces modèles dans une certaine valeur et aller.

template['price'] 

qui serait

$259

Je peux facilement injecter des données dans le modèle, mais je veux analyser les données entre mes balises de bloc.

MISE À JOUR 2 Avec l'aide de aaronasterling (THANKS) le code final est le suivant. Code final pour extraire la valeur d'un modèle Django sur le moteur de l'application. path = os.path.join (os.path.dirname (fichier), 'home/p2.html')

file = open(path) 
    entry = file.read() 
    file.close() 
    entry = entry.replace("{% extends \"product.html\" %}","") 

    t = Template(entry) 

    product = {} 
    for node in t.nodelist[0].nodelist : 
     if hasattr(node, 'name'): 
      product[node.name] = node.render(Context()) 
+1

"toutes mes données sont dans plusieurs modèles" - je ne comprends pas cela. Pourquoi les données sont-elles dans un modèle? – SingleNegationElimination

+3

C'est comme le meilleur de l'architecture MVC d'aujourd'hui accouplé avec un site Web de 1996. – aaronasterling

+0

Il était très facile de mettre toutes les données dans les modèles et les mettre dans la boîte de dépôt pour mes chefs de projet à modifier - seulement 15 pages de données, mettre tous ces dans une DB était exagéré. –

Répondre

3

On dirait que vous vous êtes tiré dans le pied. Supposons juste que nous ne sommes pas à blâmer et de le réparer:

entry = """{%block price%}$259{%endblock%} 
{%block buy%}http://www.highbeam.co.nz/store/index.php?route=product/product&path=6&product_id=116{%endblock%} 
{%block info%}http://www.inov-8.co.nz/oroc280.html{%endblock%} """ 

parsedentry = dict([(j[0].split(' ')[-1], j[-1]) for j in [i.partition("%}") for i in entry.split("{%endblock%}")] if j[0].split(' ')[-1]]) 

print parsedentry['price'] 
+0

Cela a fonctionné comme un charme! Je pensais que cela pourrait se résumer à un analyseur de jeton/chaîne. J'ai fait comme aaronasterlings approche il utilisait djangos template parser. –

1

Update 1 fixe pour traverser l'arbre entier du noeud.

Mise à jour 2 En fait testé maintenant ça fonctionne.

Voici une façon de le faire.

from django.template import Template, Context 

t = Template(template_string) # get it with open(filename).read() I guess 


def get_block_contents(t, block_name, context=None): 
    if context is None: 
     context = Context() 
    stack = t.nodelist[:] 
    while stack: 
     node = stack.pop() 
     if hasattr(node, 'name') and node.name == block_name: 
      return node.render(context) 
     if hasattr(node, 'nodelist'): 
      stack.extend(node.nodelist) 
    return False # Or raise an error 
+0

Salut, je sais que nous nous rapprochons. Je reçois AttributeError: l'objet 'Main' n'a pas d'attribut 'name' –

+0

@John, Quelle est la version de django? – aaronasterling

+0

Si c'est un moteur d'application vanille, alors probablement 0.96 – SingleNegationElimination