Supponiamo che il mio modello abbia qualcosa come {% block subject %}my subject{% endblock %}
e carico questo modello con tmpl = loader.get_template('mytemplate.html')
, come posso estrarre "il mio soggetto"?Django: Come posso ottenere un blocco da un modello?
risposta
soluzione Django di Camilo non funziona quando il modello si estende una base. Ho modificato un po 'per (si spera) risolvere questo problema:
from django.template import Context
from django.template.loader import get_template
from django.template.loader_tags import BlockNode, ExtendsNode
def _get_node(template, context=Context(), name='subject'):
for node in template:
if isinstance(node, BlockNode) and node.name == name:
return node.render(context)
elif isinstance(node, ExtendsNode):
return _get_node(node.nodelist, context, name)
raise Exception("Node '%s' could not be found in template." % name)
Io non sono davvero sicuro se questo è il modo giusto per iterare ricorsivamente su tutti i nodi ... ma funziona nella mia limitata Astuccio.
In realtà ... ho appena trovato una soluzione ancora migliore. Memorizza i modelli di email direttamente nel DB ora. Rende più facile la modifica, in grado di memorizzare sia la versione HTML sia la versione di testo in un'unica voce (anziché in 2 file) e posso aggiungere anche un campo per l'oggetto. – mpen
Ho preso questo snippet a The Next Level e l'ho reso più ampio con i modelli ricorsivi: https://github.com/bradwhittington/django-templated-email/blob/867ef61693d02a39ca902a30e66d5dd7dd941cda/templated_email/utils.py si rompe/perde informazioni se usi {{block.super}} in modelli ereditati. Accetto volentieri le correzioni che lo renderanno più completo – Darb
from django.template import Context
from django.template.loader import get_template
from django.template.loader_tags import BlockNode
t = get_template('template.html')
for node in t:
if isinstance(node, BlockNode) and node.name == 'subject':
print node.render(Context())
questo ha funzionato per me, utilizzando 1.1.1
Volevo che questo facesse un tag include che ottiene solo una sezione del modello in questione. Lo sto condividendo qui nel caso in cui qualcun altro lo volesse per lo stesso motivo.
utilizzo: {% include_block "template.html" "block_name" %}
@register.tag
def include_block(parser, token):
try:
tag_name, include_file, block_name = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError("%r tag requires a two arguments" % (token.contents.split()[0]))
#pass vars with stripped quotes
return IncludeBlockNode(include_file.replace('"', ''), block_name.replace('"', ''))
class IncludeBlockNode(template.Node):
def __init__(self, include_file, block_name):
self.include_file = include_file
self.block_name = block_name
def _get_node(self, template, context, name):
'''
taken originally from
http://stackoverflow.com/questions/2687173/django-how-can-i-get-a-block-from-a-template
'''
for node in template:
if isinstance(node, BlockNode) and node.name == name:
return node.nodelist.render(context)
elif isinstance(node, ExtendsNode):
return self._get_node(node.nodelist, context, name)
raise Exception("Node '%s' could not be found in template." % name)
def render(self, context):
t = get_template(self.include_file)
return self._get_node(t, context, self.block_name)
Le risposte proposte non funzionano dal Django 1.8:
Changed in Django 1.8: get_template() returns a backend-dependent Template instead of a django.template.Template.
I nuovi django.template.backends .django.Template non è iterabile, quindi un ciclo for dà l'errore:
'Template' object is not iterable.
a solutio n per chi usa il sistema di template Django (basato sulla risposta @ CamiloDíazRepka):
from django.template import Context
from django.template.loader import get_template
from django.template.loader_tags import BlockNode
t = get_template('template.html')
for node in t.template:
if isinstance(node, BlockNode) and node.name == 'subject':
print node.render(Context())
- 1. Posso ottenere il tipo di campo di modelli da un modello queryset in Django?
- 2. Come ottenere l'URL corrente all'interno di un modello Django?
- 3. Come ottenere oggetti da PK all'interno del modello Django?
- 4. Come posso restituire qualcosa in anticipo da un blocco?
- 5. Come ottenere l'istanza del modello corrente da inlineadmin in Django
- 6. Come creare un modello riutilizzabile in Django?
- 7. Django - L'esecuzione di un compito attraverso sedano da un modello
- 8. django __unicode __() - come posso chiamare questo metodo in un modello
- 9. Come posso impostare un formato DateField in django dal modello?
- 10. Admin Django: come posso eseguire l'override di un modello verbose_name?
- 11. Come posso ottenere un ITextBuffer da EnvDTE.Window?
- 12. Django: Ordina un modello da un campo molti-a-molti
- 13. Rubino: blocco di rendimento da un blocco?
- 14. Come posso ottenere il nome del modello o il tipo di contenuto di un oggetto Django?
- 15. Come posso ottenere a livello di codice il max_length di un campo modello Django?
- 16. Come posso ottenere il numero di oggetti per un modello nei modelli di Django?
- 17. Come ottenere l'SQL da un insieme di query Django
- 18. Come ottenere un URL ImageField all'interno di un modello?
- 19. Come popolare esternamente un modello Django?
- 20. Come posso copiare un blocco vettoriale nell'altro
- 21. Come posso ottenere tutti gli oggetti in un modello Django che hanno un valore specifico per un campo ForeignKey?
- 22. Come testare un modello Django con pytest?
- 23. Come posso ripetere un blocco N volte in un modello Meteor Spacebar?
- 24. Come posso sbloccare un blocco FileStream?
- 25. Posso avere un modulo Django senza il modello
- 26. Come posso ottenere da un blocco di codice ERB senza renderlo?
- 27. Come posso ottenere un NameTable da un XDocument?
- 28. Come posso ottenere un oggetto HDC da un oggetto CDC?
- 29. Come posso ottenere un valore da un URL?
- 30. Come posso ottenere un abbreviazione [] da un ByteBuffer
Solo per pura curiosità, perché mai vorresti? –
@Jack: email! Dispongo già di modelli di email, ma voglio mettere il soggetto anche lì. – mpen
Mi sono imbattuto in questa domanda per lo stesso motivo, volendo mettere la mia email oggetto, html e versione semplice in un modello. Qualcuno ha creato un pacchetto PIP che fa questo per te (django-render-block). –