Je veux utiliser AngularJS avec Django, mais ils utilisent tous les deux {{ }}
comme balises de modèle. Existe-t-il un moyen facile de modifier l'un des deux pour utiliser une autre balise de modèle personnalisée?
javascript
django
django-templates
angularjs
Endophage
la source
la source
templates
répertoire django , le reste que j'ai misstatic
. De cette façon, vous n'avez aucune interférence. Il y a un tutoriel que j'ai écrit ici: coderwall.com/p/bzjuka/…Réponses:
Pour Angular 1.0, vous devez utiliser les API $ interpolateProvider pour configurer les symboles d'interpolation: http://docs.angularjs.org/api/ng.$interpolateProvider .
Quelque chose comme ça devrait faire l'affaire:
Gardez à l'esprit deux choses:
{{ }}
dans leurs modèles, votre configuration les cassera. ( correction en attente )Bien que nous ne puissions rien faire à propos du premier problème, sauf pour avertir les gens, nous devons régler le deuxième problème.
la source
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
vous pouvez peut-être essayer la balise de modèle textuellement Django et l'utiliser comme ceci:
la source
Si vous avez correctement séparé les sections de la page, vous pouvez facilement utiliser les balises angularjs dans la portée de la balise "raw".
Dans jinja2
Dans le modèle Django (supérieur à 1.5)
la source
Nous avons créé un filtre très simple dans Django 'ng' qui permet de mélanger facilement les deux:
foo.html:
Le
ng
filtre ressemble à ceci:la source
J'ai donc obtenu une aide précieuse dans le canal IRC angulaire aujourd'hui. Il s'avère que vous pouvez modifier les balises de modèle d'Angular très facilement. Les extraits nécessaires ci-dessous doivent être inclus après votre inclusion angulaire (l'exemple donné apparaît sur leurs listes de diffusion et utiliserait
(())
comme nouvelles balises de modèle, en remplacement de la vôtre):De plus, on m'a signalé une amélioration à venir qui exposera
startSymbol
et desendSymbol
propriétés qui pourront être définies sur les balises que vous désirez.la source
Je vote contre l'utilisation de doubles parenthèses (()) comme balise de modèle. Cela peut bien fonctionner tant qu'aucun appel de fonction n'est impliqué, mais lorsque vous essayez ce qui suit
avec Firefox (10.0.2) sur Mac, j'ai eu une erreur terriblement longue au lieu de la logique voulue. <[]> s'est bien passé pour moi, du moins jusqu'à présent.
Edit 2012-03-29: Veuillez noter que $ invalidWidgets est déconseillé. Cependant, j'utiliserais toujours un autre wrapper que les accolades doubles. Pour toute version angulaire supérieure à 0.10.7 (je suppose), vous pouvez changer le wrapper beaucoup plus facilement dans la définition de votre application / module:
Documents API .
la source
(())
, je voulais juste pouvoir configurer les délimiteurs.J'ai trouvé le code ci-dessous utile. J'ai trouvé le code ici: http://djangosnippets.org/snippets/2787/
la source
<p>{% ng location %}</p>
elle est rendue comme{{location}}
- oui avec des accolades! Il ne rend pas la valeur de $ scope.location qui est codée en dur dans mon contrôleur. Une idée de ce qui me manque?Vous pouvez toujours utiliser ng-bind au lieu de {{}} http://docs.angularjs.org/api/ng/directive/ngBind
la source
Si vous utilisez django 1.5 et une utilisation plus récente:
Si vous êtes bloqué avec django 1.2 sur appengine, étendez la syntaxe django avec la commande de modèle verbatim comme ceci ...
Dans votre fichier, utilisez:
Source: http://bamboobig.blogspot.co.at/2011/09/notebook-using-jquery-templates-in.html
la source
from django import template
à:from google.appengine._internal.django import template
Ensuite, dans mon fichier principal, changez simplement le nom de fichier:template.register_template_library('utilities.verbatim_template_tag')
Vous pouvez dire à Django de sortir
{{
et}}
, ainsi que d'autres chaînes de modèle réservées, en utilisant la{% templatetag %}
balise.Par exemple, l'utilisation
{% templatetag openvariable %}
produirait{{
.la source
Je m'en tiendrai à une solution qui utilise à la fois les balises django {{}} ainsi que les angularjs {{}} avec une section verbatim ou un templatetag.
C'est simplement parce que vous pouvez changer la façon dont angularjs fonctionne (comme mentionné) via $ interpolateProvider.startSymbol $ interpolateProvider.endSymbol mais si vous commencez à utiliser d'autres composants angularjs comme le ui-bootstrap, vous constaterez que certains des modèles sont DÉJÀ construits avec des balises angularjs standard {{}}.
Par exemple, regardez https://github.com/angular-ui/bootstrap/blob/master/template/dialog/message.html .
la source
Si vous effectuez une interpolation côté serveur, la seule façon correcte de le faire est de
<>
Tout le reste est un vecteur XSS.
En effet, tout délimiteur angulaire non échappé par Django peut être entré par l'utilisateur dans la chaîne interpolée; si quelqu'un définit son nom d'utilisateur sur "{{evil_code}}", Angular l'exécute avec plaisir . Cependant, si vous utilisez un personnage que Django échappe , cela ne se produira pas.
la source