Handlebars.js dans les modèles Django
J'ai besoin d'un javascript système de template et je pense que handlebars.js fait un excellent travail dans ce cas.
Je vais avoir la syntaxe des conflits avec un guidon de modèles à l'intérieur d'un django modèle parce que django essaye de rendre guidon variables.
Est-il une balise dans django modèles d'arrêter le rendu d'un bloc avec des accolades?
Quelque chose comme:
{{ django_context_varable }} #works
{{% raw %}}
<script id="restaurants-tpl" type="text/x-handlebars-template">
<ul>
{{#restaurants}} #not rendered by django, plain text
<li>{{name}}</li>
{{/restaurants}}
</ul>
</script>
{{% endraw %}}
Modifier
Probable que j'ai trouvé cette. Il fonctionne très bien.
Mise à jour
Django 1.5 supporte verbatim balise en mode natif.
- +1 pour la mise à jour sur le compte de la balise
- J'avais précompiler le guidon modèle et l'utiliser comme une ressource statique: stackoverflow.com/a/42636375/4326531
InformationsquelleAutor tsiokos | 2011-08-29
Vous devez vous connecter pour publier un commentaire.
VIEILLE Réponse pour Django 1.0-1.4:
Non, si vous pourriez si vous pouviez mettre le bloc dans un fichier séparé et de les inclure sans rendre ou d'utiliser un autre moteur de template.Nouvelle Réponse: La réponse ci-dessus est correcte en août 2011, lorsque la question a été posée et répondue. Départ dans Django 1.5 (sorti en Février 2013, bien que l'alpha/beta versions à la fin de 2012), ils ont introduit la
{% verbatim %}
et{% endverbatim %}
qui empêchera le moteur de template de django à partir de traitement du contenu dans le bloc.Donc, pour la question posée, la suite des travaux dans django 1.5+ de la boîte:
La documentation sur verbatim est ici. Oui, cela a été noté par d'autres plus tôt, mais comme c'est la réponse que je devrais liste la solution la plus simple.
{% ssi %}
fait la même chose (comme {% include_raw %}) et il est déjà dans la norme- Je utiliser un modèle personnalisé pour un autre tag js système de template, ici:
https://gist.github.com/629508
Utiliser dans le modèle:
Edit: Ce personnalisées balise de modèle n'est plus nécessaire, comme Django template language prend désormais en charge l' {% verbatim %} balise de modèle.
{%
et{{
(par exemple, un filtre comme{{ some_var|some_filter:"hello"}}
). Mais il peut très bien le travail pour les cas nécessaire.pour une intégration plus poussée entre le guidon et Django (y compris en option sur la volée de précompilation) découvrez mon projet à
https://bitbucket.org/chrisv/django-handlebars/
Il fonctionne en fait comme ceci:
créer HB modèle sous
(tout comme Django template)
dans votre application, utilisez
balise de modèle et le modèle de rendu comme suit:
J'ai écrit une très petite application django : django-templatetag-guidon exactement à cette fin.
Rendre votre bloc comme d'habitude en utilisant
Handlebars.js
API :Je l'ai écrit le jour @chrisv publié son emballage, avec un BAISER approche à l'esprit. Il est principalement basé sur Miguel Araujo est essentiel : https://gist.github.com/893408.
Compiler votre guidon premier!
De guidon précompilation de la documentation:
Vous pouvez compiler des modèles dans votre environnement de compilation à l'aide de guidon module npm, ou l'intégrer à un outil de construction comme gulp avec gulp-guidon.
Après la compilation, le guidon de modèles peut être servi comme statique des ressources et de dérivation côté serveur de rendu tout à fait. Facilite la mise en cache trop 🙂
Utilisation typique pourrait ressembler à ceci:
HTML:
Pourquoi ne pas utiliser jinja2 à la place? OMI, ils sont à la fois élégante à utiliser. Voici un excellent article sur le sujet: À l'aide de Jinja2 avec Django
Django template système ne peut pas échapper à des blocs à la fois. Il serait facile de contourner était pas pour le fait que lorsque les modèles sont traitées le tokenizer ne conserve pas les informations exactes sur ce que les jetons ressemblait avant ils ont obtenu sous forme de jeton.
J'ai utilisé le travail autour de ce qui est laid, mais (un peu) de travaux. L'utilisation de balise différent des séparateurs dans vos templates et un django balise de modèle qui se traduit par ces retour à ce que vous voulez vraiment:
Pour les points de bonus que vous pouvez tirer parti de Django reinhardt, des modèles à l'intérieur de vos modèles ...
qui va probablement faire cuire votre cerveau à essayer de démêler plus tard:
En fait, j'ai écrit un modèle personnalisé filtre qui va comme ceci:
et de l'utiliser dans un modèle comme suit:
C'est la chose la plus simple que je pouvais penser. Vous avez juste à mettre votre guidon nom de la variable entre guillemets. Je regrette que je n'avais pas eu cette idée avant que j'ai eu du mal avec la ssi. Cela marche aussi avec les mots-clés: