TemplateSyntaxError - Неверный фильтр: 'translate' [duplicate]

Проще говоря:

> var a = 1
undefined
> a.__proto__
[Number: 0]
> Number.prototype
[Number: 0]
> Number.prototype === a.__proto__
true

Это позволяет вам прикрепить свойства к X.prototype ПОСЛЕ того, как объекты типа X были созданы, и они все равно получат доступ к этим новым свойствам через __proto__ ссылка, которую Javascript-движок использует, чтобы подойти к цепочке прототипов.

287
задан Dominic Mitchell 6 March 2012 в 11:53
поделиться

13 ответов

Для Angular 1.0 вы должны использовать aps-интерполяциюProvider для настройки интерполяционных символов: http://docs.angularjs.org/api/ng.$interpolateProvider .

Что-то вроде этого должно сделать трюк:

myModule.config(function($interpolateProvider) {
  $interpolateProvider.startSymbol('{[{');
  $interpolateProvider.endSymbol('}]}');
});

Имейте в виду две вещи:

  • смешивание серверных и клиентских шаблонов редко является хорошей идеей и должно следует использовать с осторожностью. Основные проблемы: ремонтопригодность (трудно читаемая) и безопасность (двойная интерполяция может выставить новый вектор безопасности, например, при одновременном удалении серверов и клиентских шаблонов сами по себе могут быть безопасными, их комбинация не может быть).
  • , если вы начинаете использовать сторонние директивы (компоненты), которые используют {{ }} в своих шаблонах, тогда ваша конфигурация нарушит их. ( исправление ожидает )

Хотя мы ничего не можем сделать по первому вопросу, кроме предупреждения людей, нам нужно решить вторую проблему.

293
ответ дан Joseph Silber 20 August 2018 в 23:07
поделиться
  • 1
    Не могли бы вы объяснить свою первую точку (обслуживание, безопасность и другие проблемы для смешивания серверных и клиентских шаблонов)? Немного больше объяснений было бы полезно. – btlachance 3 July 2012 в 20:09
  • 2
    @btlachance - я расширил ответ. – Igor Minar 11 August 2012 в 08:23
  • 3
    Поскольку $ interpolateProvider возвращает self при использовании в качестве сеттера, вот немного более компактная версия: $interpolateProvider.startSymbol('{[{').endSymbol('}]}'); – Mark Rajcok 20 October 2012 в 17:48
  • 4
    Похож на "fix" закрыто. Означает ли это, что теперь не безопасно использовать сторонние компоненты? – Alex Okrushko 10 December 2012 в 01:37
  • 5
    любой способ также обновить $ interpolateProvider для сырой продукции? например {{{foo}}} становится {{[{foo}]}}? – tester 26 August 2013 в 08:05

Для AngularJS v1.3.3 вы должны определить свои собственные теги шаблонов, такие как

Модуль AngularJS

angular.module('myapp', []).config(function($interpolateProvider) {
    $interpolateProvider.startSymbol('{$');
    $interpolateProvider.endSymbol('$}');
});

Веб-страница

<a>{$ variable $}</a> 
9
ответ дан Alex Jolig 20 August 2018 в 23:07
поделиться
11
ответ дан cat 20 August 2018 в 23:07
поделиться

Если вы выполняете любую интерполяцию на стороне сервера, единственный правильный способ сделать это - <>

$interpolateProvider.startSymbol('<{').endSymbol('}>');

. Все остальное является XSS-вектором.

Это потому что любые угловые разделители, которые не экранируются Django, могут быть введены пользователем в интерполированную строку; если кто-то устанавливает свое имя пользователя как «{{evil_code}}», Угловой будет с радостью запускать его . Однако если вы используете символ , чем escape-файлы Django , это не произойдет.

0
ответ дан Dan 20 August 2018 в 23:07
поделиться

Итак, сегодня я получил большую помощь в 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, которые могут быть настроены на любые теги, которые вы хотите.

26
ответ дан Endophage 20 August 2018 в 23:07
поделиться
  • 1
    и так вы делаете это в angularjs 1.0: var m = angular.module ('myApp', []); m.config (function ($ interpolateProvider) {$ interpolateProvider.startSymbol ('(('); $ interpolateProvider.endSymbol ('))');}); – idursun 19 March 2012 в 15:45
  • 2
    Угловой канал IRC. fwiw кому бы то ни было, я нашел его в #angularjs – Shanimal 10 October 2012 в 21:01

Я нашел код ниже полезным. Я нашел код здесь: 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)
15
ответ дан furins 20 August 2018 в 23:07
поделиться
  • 1
    Я использовал этот пользовательский тег, но если я использую что-то вроде: <p>{% ng location %}</p>, он будет отображаться как {{location}} - да с фигурными фигурными скобками! Он не отображает значение $ scope.location, которое жестко закодировано в моем контроллере. Любая идея, что мне не хватает? – Keshav Agrawal 11 May 2014 в 11:14

Если вы правильно разделили разделы страницы, вы можете легко использовать теги angularjs в области «raw».

В jinja2

{% raw %}
    // here you can write angularjs template tags.
{% endraw %}

В шаблоне Django (выше 1.5 )

{% verbatim %}    
    // here you can write angularjs template tags.
{% endverbatim %}
42
ответ дан geoffspear 20 August 2018 в 23:07
поделиться
  • 1
    Это решение не нарушает совместимость с внешними пакетами, как принятый ответ. – partizanos 10 May 2016 в 12:35

Вы всегда можете использовать ng-bind вместо {{}} http://docs.angularjs.org/api/ng/directive/ngBind

<span ng-bind="name"></span>
14
ответ дан Indomitable 20 August 2018 в 23:07
поделиться
17
ответ дан RichVel 20 August 2018 в 23:07
поделиться

Я бы придерживался решения, которое также использует теги django {{}}, а также angularjs {{}} с дословным разделом или templatetag.

Это просто потому, что вы можете изменить способ работы angularjs (как упоминалось) через $ interpolateProvider.startSymbol $ interpolateProvider.endSymbol, но если вы начнете использовать другие компоненты angularjs, такие как ui-bootstrap, вы обнаружите, что некоторые из шаблонов УЖЕ построены с помощью стандартных меток angularjs {{}}.

Например, посмотрите https://github.com/angular-ui/bootstrap/blob/master/template/dialog/message.html .

3
ответ дан silviud 20 August 2018 в 23:07
поделиться
  • 1
    Хорошая точка зрения. В PyPI теперь есть django-угловой пакет, который призван сделать эти игры хорошими вместе, но я не рассмотрел, насколько это облегчает проблему с тегом шаблона. – Endophage 29 June 2013 в 23:18

вы можете попробовать verbatim шаблон шаблона 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 %}

114
ответ дан texnic 20 August 2018 в 23:07
поделиться
  • 1
    Хотя это очень правильное решение, есть случаи, когда я хочу иметь возможность загружать мои представления с данными с сервера, чтобы это быстро стало беспорядочным. Подумайте о таких вещах, как имя пользователя пользователя, оно не изменится, поэтому я просто напишу его в шаблон на сервере, но вокруг него могут быть части, которые я напишу с угловым. – Endophage 30 May 2012 в 18:36
  • 2
  • 3
    В Django 1.7 вам не нужно загружать дословно, так как он находится в стандартной библиотеке тегов. Вам нужно всего лишь использовать теги. – highpost 22 October 2014 в 06:41
  • 4
    Было бы неплохо иметь способ изменить стандартные скобки Django из настроек, но это тоже работает. – Adrian Lopez 28 October 2014 в 18:34

Вы можете указать Django для вывода {{ и }}, а также других зарезервированных строк шаблона с помощью тега {% templatetag %} .

Например, используя {% templatetag openvariable %} выводит {{.

7
ответ дан Thomas Orozco 20 August 2018 в 23:07
поделиться
  • 1
    Я знаю, что это возможно, но это грязно ... Было бы намного чище (и не кажется слишком большим спросом), чтобы тег шаблона просто настраивался в одной из фреймворков. В конце концов, это просто выполнение строки за кулисами ... – Endophage 29 November 2011 в 04:52

Мы создали простой фильтр very в Django 'ng', который позволяет легко смешивать два:

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)
29
ответ дан Wes Alvaro 20 August 2018 в 23:07
поделиться
  • 1
    Еще один очень правильный способ сделать это, однако я бы скорее изменил теги в одном месте, чем добавить фильтр во многих ... – Endophage 27 August 2012 в 17:35
  • 2
    Как вы создаете фильтр ng? Можете ли вы добавить пример? – Ben Liyanage 9 December 2014 в 01:22
  • 3
    Обновленный ответ. @Endophage У меня есть lot больше угловых {{}} пар, чем у меня есть пары Django {{}}, поэтому я бы предпочел обновить Django. – Wes Alvaro 20 May 2015 в 06:23
  • 4
    @WesAlvaro, к сожалению, я могу принять только один ответ. – Endophage 20 May 2015 в 17:05
Другие вопросы по тегам:

Похожие вопросы: