AngularJSをDjangoで使用したいのですが、どちらも{{ }}
テンプレートタグとして使用しています。他のカスタムテンプレートタグを使用するように2つのうちの1つを変更する簡単な方法はありますか?
AngularJSをDjangoで使用したいのですが、どちらも{{ }}
テンプレートタグとして使用しています。他のカスタムテンプレートタグを使用するように2つのうちの1つを変更する簡単な方法はありますか?
回答:
Angular 1.0の場合、$ interpolateProvider apisを使用して補間シンボルを構成する必要があります:http : //docs.angularjs.org/api/ng.$interpolateProvider。
このようなことがうまくいくはずです:
myModule.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
});
次の2つの点に注意してください。
{{ }}
テンプレートで使用するサードパーティのディレクティブ(コンポーネント)の使用を開始すると、構成によってそれらが破壊されます。(修正保留中)最初の問題については、警告する人以外は何もできませんが、2番目の問題に対処する必要があります。
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
あなたは多分逐語的な Djangoテンプレートタグを試して、このようにそれを使うことができます:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
{% verbatim %}
<div ng-app="">
<p>10 is {{ 5 + 5 }}</p>
</div>
{% endverbatim %}
ページのセクションを適切に分離した場合、 "raw"タグのスコープでangularjsタグを簡単に使用できます。
jinja2で
{% raw %}
// here you can write angularjs template tags.
{% endraw %}
Djangoテンプレート(1.5以上)
{% verbatim %}
// here you can write angularjs template tags.
{% endverbatim %}
Django 'ng'で2つを簡単に組み合わせることができる非常にシンプルなフィルターを作成しました。
foo.html:
...
<div>
{{ django_context_var }}
{{ 'angularScopeVar' | ng }}
{{ 'angularScopeFunction()' | ng }}
</div>
...
ng
フィルタは、次のようになります。
from django import template
from django.utils import safestring
register = template.Library()
@register.filter(name='ng')
def Angularify(value):
return safestring.mark_safe('{{%s}}' % value)
今日、Angular IRCチャンネルで大きな助けを得ました。Angularのテンプレートタグを非常に簡単に変更できることがわかりました。以下の必要なスニペットは、角度インクルードの後に含める必要があります(特定の例はメーリングリストに表示さ(())
れ、新しいテンプレートタグとして使用し、独自のタグの代わりになります):
angular.markup('(())', function(text, textNode, parentElement){
if (parentElement[0].nodeName.toLowerCase() == 'script') return;
text = text.replace(/\(\(/g,'{{').replace(/\)\)/g, '}}');
textNode.text(text);
return angular.markup('{{}}').call(this, text, textNode, parentElement);
});
angular.attrMarkup('(())', function(value, name, element){
value = value.replace(/\(\(/g,'{{').replace(/\)\)/, '}}');
element[0].setAttribute(name, value);
return angular.attrMarkup('{{}}').call(this, value, name, element);
});
また、私は公開します今後の強化を指摘したstartSymbol
とendSymbol
あなたが望むものは何でもタグに設定できるプロパティ。
二重括弧(())をテンプレートタグとして使用することに反対します。関数呼び出しが含まれていない限りうまく機能する可能性がありますが、次の場合
ng:disabled=(($invalidWidgets.visible()))
Mac上のFirefox(10.0.2)では、意図したロジックではなく、非常に長いエラーが発生しました。<[]>は、少なくとも今まではうまくいきました。
2012-03-29を編集: $ invalidWidgetsは非推奨であることに注意してください。ただし、二重ブレース以外のラッパーを使用します。0.10.7(おそらく)よりも高い角度のバージョンでは、アプリ/モジュールの定義でラッパーをはるかに簡単に変更できます。
angular.module('YourAppName', [], function ($interpolateProvider) {
$interpolateProvider.startSymbol('<[');
$interpolateProvider.endSymbol(']>');
});
(())
、を使用することを特に主張していませんでした。区切り文字を構成できるようにしたかっただけです。
以下のコードが参考になりました。私はここにコードを見つけました:http : //djangosnippets.org/snippets/2787/
"""
filename: angularjs.py
Usage:
{% ng Some.angular.scope.content %}
e.g.
{% load angularjs %}
<div ng-init="yourName = 'foobar'">
<p>{% ng yourName %}</p>
</div>
"""
from django import template
register = template.Library()
class AngularJS(template.Node):
def __init__(self, bits):
self.ng = bits
def render(self, ctx):
return "{{%s}}" % " ".join(self.ng[1:])
def do_angular(parser, token):
bits = token.split_contents()
return AngularJS(bits)
register.tag('ng', do_angular)
<p>{% ng location %}</p>
レンダリングされます{{location}}
-はい、中括弧で!コントローラにハードコードされている$ scope.locationの値をレンダリングしません。何が欠けているのですか?
{{}}の代わりに常にng-bindを使用でき ますhttp://docs.angularjs.org/api/ng/directive/ngBind
<span ng-bind="name"></span>
django 1.5以降を使用する場合:
{% verbatim %}
{{if dying}}Still alive.{{/if}}
{% endverbatim %}
appengineでdjango 1.2を使用できない場合は、次のように逐語テンプレートコマンドを使用してdjango構文を拡張します...
from django import template
register = template.Library()
class VerbatimNode(template.Node):
def __init__(self, text):
self.text = text
def render(self, context):
return self.text
@register.tag
def verbatim(parser, token):
text = []
while 1:
token = parser.tokens.pop(0)
if token.contents == 'endverbatim':
break
if token.token_type == template.TOKEN_VAR:
text.append('{{')
elif token.token_type == template.TOKEN_BLOCK:
text.append('{%')
text.append(token.contents)
if token.token_type == template.TOKEN_VAR:
text.append('}}')
elif token.token_type == template.TOKEN_BLOCK:
text.append('%}')
return VerbatimNode(''.join(text))
あなたのファイルで:
from google.appengine.ext.webapp import template
template.register_template_library('utilities.verbatim_template_tag')
出典:http : //bamboobig.blogspot.co.at/2011/09/notebook-using-jquery-templates-in.html
from django import template
ように from google.appengine._internal.django import template
変更します。次に、メインファイルでファイル名を変更しました: template.register_template_library('utilities.verbatim_template_tag')
タグを使用して、Djangoに{{
と}}
、およびその他の予約済みテンプレート文字列を出力するように指示できます{% templatetag %}
。
たとえば、を使用{% templatetag openvariable %}
するとが出力されます{{
。
私は、djangoタグ{{}}とangularjs {{}}の両方を逐語的セクションまたはテンプレートタグで使用するソリューションを使い続けます。
これは、$ interpolateProvider.startSymbol $ interpolateProvider.endSymbolを介してangularjsの動作を(前述のように)変更できるためですが、ui-bootstrapなどの他のangularjsコンポーネントの使用を開始すると、一部のテンプレートが既に構築されていることがわかります標準のangularjsタグ{{}}を使用します。
たとえば、https://github.com/angular-ui/bootstrap/blob/master/template/dialog/message.htmlをご覧ください。
サーバー側の補間を行う場合、これを行う唯一の正しい方法は<>
$interpolateProvider.startSymbol('<{').endSymbol('}>');
それ以外はXSSベクトルです。
これは、DjangoによってエスケープされないAngular区切り文字が、ユーザーが補間文字列に入力できるためです。ユーザー名が「{{evil_code}}」に設定されている場合、Angularはそれを喜んで実行します。ただし、Djangoがエスケープする文字以外の文字を使用すると、これは起こりません。
templates
ディレクトリから1つのテンプレートのみをレンダリングし、残りは私が入れましたstatic
。そうすれば、干渉を受けることがありません。私がここに書いたチュートリアルがあります:coderwall.com/p/bzjuka/...は