2015-03-08 3 views
0

Я использую Django с API Google Chart. Мне нужно построить массив JavaScript, чтобы отобразить гистограмму, показывающую # объектов, созданных в данный день.Получить массив JavaScript из представления Django

ожидается массив печатается в шаблоне должен выглядеть следующим образом:

... 

    function drawStuff() { 
    var data = new google.visualization.arrayToDataTable([ 
     ['Date', '# of records'], 
     ['2015-03-07', 3], // Expected format: ['Date', # of objects] 
     ['2015-03-08', 8], 
    ]); 

    ... 

views.py:

class LogsView(TemplateView): 
    template_name = 'logs.html' 


    def ValuesQuerySetToDict(self, vqs): 
     return [ [item['date_created'], item['created_count'] ] for item in vqs] 

    def render_chart_data(self, **kwargs): 
     queryset = LogEntry.objects.filter(user=self.request.user).extra(
      {'date_created': 'date(created)'} 
      ).values('date_created').annotate(created_count=Count('id')) 
     modified_dict = self.ValuesQuerySetToDict(queryset) 

     return json.dumps(modified_dict) 


    def get_context_data(self, **kwargs): 
     context = super(
      LogsView, self 
     ).get_context_data(**kwargs) 

     context['chart_data'] = self.render_chart_data() 

визуализируется в шаблон Джанго следующее (я обошел отправьте его на JavaScript, чтобы посмотреть, что было возвращено.

weird formatted data

Когда я считаю, что я должен вернуть массив JavaScript, как следующее:

["2015-02-18", 3], 
["2015-02-19", 12], 
["2015-02-21", 1], 

И кормить, что функции drawStuff, которая будет воспроизводить BarChart.

Альтернативный метод

Я следовал this thread на StackOverflow и модифицировал render_chart_data использовать Джанго сериалайзер like this, но я получаю сообщение об ошибке: "„ДИКТ“объект не имеет атрибута„_meta“

+0

Вы уверены, что 'queryset',' convert' или 'json_data' содержит ваши ожидаемые значения? – Joseph

+0

@JosephtheDreamer - Я обновил и теперь подтверждаю, что данные запроса запрашиваются через представление Django. –

+0

Как насчет 'modified_dict'? Можете ли вы обновить сообщение со значениями, чтобы мы могли проверить, действительно ли 'json.dumps' предоставлены правильные значения? – Joseph

ответ

1

Спасибо всем, кто предложил свою помощь в этом.

Две вещи, необходимые для изменения; функция ValuesQuerySetToDict нужно переписать следующим образом:

def ValuesQuerySetToDict(self, vqs): 
    list_vals = [ ['Date', '# of records'] ] 
    for item in vqs: 
     list_vals.append(
      # convert datetime object to string otherwise JSON serialization error 
      [ str(item['date_created']), item['created_count'] ] 
      ) 

    return list_vals 

И функцию render_chart_data нужно быть переписано следующим образом:

def render_chart_data(self, **kwargs): 
    queryset = LogEntry.objects.filter(user=self.request.user).extra(
     {'date_created': 'date(created)'} 
     ).values('date_created').annotate(created_count=Count('id')).order_by('created-date') 
    modified_list = list(self.ValuesQuerySetToDict(queryset)) 
    json_data = json.dumps(modified_list) 

    return json_data 

Наконец, {{chart_data}} необходимо, чтобы быть переданы в drawStuff функция, например, так:

function drawStuff() { 
    var data = new google.visualization.arrayToDataTable(
     {{ chart_data|safe }} 
     ); 

Я отправил views.py и logs.html here.

-1
  1. В вашем наборе запросов визуализируйте created_count как строку, а не как целое. Json's не ведет себя хорошо с помощью целых чисел.
  2. В вашей функции JS drawStuff, chart_data следует разобрать как json. Смотрите ниже:
var json_string = '{{chart_data}}'; 
var json = JSON.parse(json_string); 
var data = new google.visualization.arrayToDataTable(json) 
Смежные вопросы