Тег шаблона в Javascript

Мои теги шаблона Django не работают в моем javascript. Моя последняя ошибка: SyntaxError: expected expression, got '&' var resourceTypes = ['Structural Model', 'X-Ray Diffraction']

Как я могу заставить это работать? Мне нужно получить эти переменные Django в js, чтобы я мог создать диаграмму (я использую Google Charts)

index.html

<script>
  function drawChart() {

    // Create the data table.
    var data = new google.visualization.DataTable();
    data.addColumn('string');
    data.addColumn('number');

    var resourceTypes = {{ "all"|resource_types }}

    {% for x in resourceTypes %}
        data.addRows([
          [x, {{ x|resourceType_count }}],
        ]);
    {% endfor %}

    // Set chart options
    var options = {'title':'Datasets by Type',
                   'width':400,
                   'height':300};

    // Instantiate and draw our chart, passing in some options.
    var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
    chart.draw(data, options);
  }

</script>

шаблонтеги.py

@register.filter(name='resource_types')
def resource_types(data_type):
    resourceTypes = [ str(x.data_type) for x in ResourceType.objects.all() ]
    return resourceTypes

@register.filter(name='resourceType_count')
def resourceType_count(data_type):
    count = Dataset.objects.filter(data_type=ResourceType.objects.get(data_type=data_type)).count()
    return count

person plact    schedule 09.06.2015    source источник


Ответы (1)


Вы можете рассмотреть возможность использования тега назначения:

from collections import Counter

@register.assignment_tag(takes_context=True)
def get_resource_types(context):
    values = dict(Counter(list(map(str, ResourceType.objects.values_list('data_type', flat=True)))))
    return {'resource_types': values}

Это даст вам количество каждой строки data_type в списке значений, например:

{'data type 1': 3, 'data type 2': 10, 'data type 3': 47}

который вы затем можете передать функции .addRows():

{% get_resource_types as resource_types %}

data.addRows([
    {% for data_type, count in resource_types.items %}
    ['{{ data_type }}', {{ count }}],
    {% endfor %}
]);

Это должно позволить вам делать все в одном запросе к базе данных вместо того, чтобы запрашивать каждый из них. Вы также можете сделать это с помощью совокупного количества каждого типа в наборе запросов. В зависимости от того, сколько данных мы говорим, я не могу точно сказать, какой из них будет быстрее.

person Brandon    schedule 10.06.2015
comment
Становимся намного ближе! спасибо @brandon Это устранило эту проблему, но теперь {% for x in resourceTypes %} не работает - есть идеи, почему этот цикл не работает? - person plact; 10.06.2015
comment
Что значит не работает? Есть ли ошибка? цикл не повторяется? Пожалуйста, объясни - person Brandon; 10.06.2015
comment
Ошибки нет - это вообще не итерация. Я добавил console.log(x); прямо внутри цикла for, и он даже не печатается. - person plact; 10.06.2015
comment
о, @brandon, только что увидел твое последнее редактирование - я тоже попробую прямо сейчас - person plact; 10.06.2015
comment
Я добавил для вас альтернативную реализацию, но при повторном прочтении вашего вопроса я вижу, что вы передаете data_type для подсчета. Есть еще один способ сделать это. Потерпите меня, и я дам вам обновленную реализацию. - person Brandon; 10.06.2015
comment
Большое спасибо, я пытаюсь поместить data_type, который является строкой, и счетчик, который является целым числом, в data.addRows, чтобы я мог создать диаграмму. - person plact; 10.06.2015
comment
Добавлен рефакторинг примера. Мне нужно немного отлучиться, но я постараюсь помочь позже, если это возможно. - person Brandon; 10.06.2015
comment
Превосходно! БЛАГОДАРЮ ВАС!! Я получаю новую ошибку: SyntaxError: missing ; before statement {'resource_types': {u'X-Ray Diffraction': 1, u'Structural Model': 1}} Я посмотрю, смогу ли я понять это, и отпишусь, когда закончу с - person plact; 10.06.2015
comment
ааа так близко снова: SyntaxError: missing ; before statement {'resource_types': {'X-Ray Diffraction': 1, 'Structural Model': 1}} - person plact; 10.06.2015
comment
Возможно, в конце var resourceTypes = {{ "all"|resource_types }} ? Что вам сейчас не нужно, но определенно проблема с JavaScript. - person Brandon; 10.06.2015
comment
Не совсем понял? Я использую вашу новую реализацию только сейчас...? - person plact; 10.06.2015
comment
Ошибка, которую вы получаете на стороне Javascript? Или сторона Python? - person Brandon; 10.06.2015
comment
Javascript - я вижу это в консоли: не похоже, что цикл for повторяется, хотя я думаю, что ошибка происходит с {% get_resource_types %} непосредственно перед циклом for - person plact; 10.06.2015
comment
Давайте продолжим обсуждение в чате. - person Brandon; 10.06.2015