Chcę używać AngularJS z Django, jednak oba używają {{ }}
jako znaczników szablonów. Czy istnieje prosty sposób na zmianę jednego z dwóch, aby użyć innego niestandardowego znacznika szablonów?
javascript
django
django-templates
angularjs
Endofag
źródło
źródło
templates
katalogu django , resztę wstawiamstatic
. W ten sposób nie będziesz mieć zakłóceń. Jest tutorial, który napisałem tutaj: coderwall.com/p/bzjuka/…Odpowiedzi:
W przypadku Angulara 1.0 należy użyć apis $ interpolateProvider do skonfigurowania symboli interpolacji: http://docs.angularjs.org/api/ng.$interpolateProvider .
Coś takiego powinno załatwić sprawę:
Pamiętaj o dwóch rzeczach:
{{ }}
ich szablonów, twoja konfiguracja je zepsuje. ( poprawka w toku )Chociaż nic nie możemy zrobić z pierwszym problemem, z wyjątkiem ostrzegania ludzi, musimy zająć się drugim problemem.
źródło
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
możesz spróbować dosłownie tagu szablonu Django i użyć go w następujący sposób:
źródło
Jeśli poprawnie rozdzieliłeś sekcje strony, możesz łatwo użyć tagów angularjs w zakresie „surowego” tagu.
W jinja2
W szablonie Django (powyżej 1.5)
źródło
Stworzyliśmy bardzo prosty filtr w Django 'ng', który ułatwia mieszanie dwóch:
foo.html:
ng
Filtr wygląda następująco:źródło
Więc dzisiaj otrzymałem świetną pomoc w kanale Angular IRC. Okazuje się, że możesz bardzo łatwo zmieniać tagi szablonu Angulara. Niezbędne fragmenty poniżej powinny zostać uwzględnione po uwzględnieniu angulara (podany przykład pojawia się na ich listach mailingowych i posłużyłby
(())
jako nowe tagi szablonu, zastępując własne):Wskazano także na nadchodzące ulepszenie, które ujawni
startSymbol
iendSymbol
właściwości, które można ustawić na dowolne tagi.źródło
Głosuję przeciwko użyciu podwójnego nawiasu (()) jako tagu szablonu. Może działać dobrze, o ile nie ma w nim wywołania funkcji, ale po wypróbowaniu następujących czynności
z Firefoksem (10.0.2) na Macu dostałem strasznie długi błąd zamiast zamierzonej logiki. <[]> szło mi dobrze, przynajmniej do tej pory.
Edytuj 2012-03-29: Pamiętaj, że $ invalidWidgets jest przestarzałe. Jednak nadal użyłbym innego opakowania niż podwójne szelki. W przypadku dowolnej wersji kątowej wyższej niż 0.10.7 (tak sądzę) można znacznie łatwiej zmienić opakowanie w definicji aplikacji / modułu:
Dokumentacja API .
źródło
(())
, po prostu chciałem móc skonfigurować ograniczniki.Poniższy kod był pomocny. Znalazłem kod tutaj: http://djangosnippets.org/snippets/2787/
źródło
<p>{% ng location %}</p>
zostanie renderowany jako{{location}}
- tak z nawiasami klamrowymi! Nie wyświetla wartości $ scope.location, która jest zapisana na stałe w moim kontrolerze. Masz pojęcie, czego mi brakuje?Zawsze możesz użyć ng-bind zamiast {{}} http://docs.angularjs.org/api/ng/directive/ngBind
źródło
Jeśli używasz django 1.5 i nowszych:
Jeśli utkniesz z django 1.2 na appengine, rozszerz składnię django za pomocą polecenia szablonu verbatim w ten sposób ...
W swoim pliku użyj:
Źródło: http://bamboobig.blogspot.co.at/2011/09/notebook-using-jquery-templates-in.html
źródło
from django import template
na:from google.appengine._internal.django import template
Następnie, w moim głównym pliku, właśnie zmieniłem nazwę pliku:template.register_template_library('utilities.verbatim_template_tag')
Można powiedzieć Django do wyjścia
{{
i}}
, jak również inne zastrzeżone ciągi szablon za pomocą{% templatetag %}
znacznika.Na przykład użycie
{% templatetag openvariable %}
spowoduje wyjście{{
.źródło
Trzymałbym się rozwiązania, które wykorzystuje zarówno tagi django {{}}, jak i angularjs {{}} z sekcją dosłowną lub szablonem.
Jest tak po prostu dlatego, że możesz zmienić sposób działania angularjs (jak wspomniano) za pomocą $ interpolateProvider.startSymbol $ interpolateProvider.endSymbol, ale jeśli zaczniesz używać innych komponentów angularjs, takich jak ui-bootstrap, przekonasz się, że niektóre szablony są już zbudowane ze standardowymi tagami angularjs {{}}.
Na przykład spójrz na https://github.com/angular-ui/bootstrap/blob/master/template/dialog/message.html .
źródło
Jeśli wykonujesz interpolację po stronie serwera, jedynym prawidłowym sposobem na to jest użycie
<>
Wszystko inne jest wektorem XSS.
Wynika to z faktu, że dowolne ograniczniki kątowe, które nie są poprzedzane przez Django, mogą zostać wprowadzone przez użytkownika do interpolowanego ciągu; jeśli ktoś ustawi swoją nazwę użytkownika na „{{evil_code}}”, Angular chętnie ją uruchomi . Jeśli użyjesz postaci, a Django ucieknie , tak się nie stanie.
źródło