2015-01-07 4 views
5

처음 포스터, 오랜 시간 리더. 나는 이것에 대한 답을 찾기 위해 꽤 오래 동안 보냈습니다. 그것은 내가 놓치고있는 근본적인 것을 생각하게 만듭니다.JSON을 통해 장고 데이터베이스 쿼리 세트를 하이 차트에 전달

데이터베이스 테이블에있는 데이터를 가져 와서 Highcharts 플롯에 표시하려고합니다. 소스를 검사 할 때 Django 나 클라이언트에서 오류가 발생하지 않습니다.

사용 장고 1.7 3.4 파이썬

를 views.py :

#unit/views.py 
from django.http import JsonResponse 
from django.shortcuts import render 
from unit.analysis_funcs import ChartData 

def chart_data_json(request): 
    data = {} 
    data['chart_data'] = ChartData.get_data() 
    return JsonResponse(data, safe = True) 

def plot(request):  
    return render(request, 'unit/data_plot.html', {}) 

get_data() 함수 :

#unit/analysis_funcs.py 
from unit.models import CheckValve 

class ChartData(object):  
    def get_data(): 
     data = {'serial_numbers': [], 'mass': []} 

     valves = CheckValve.objects.all() 

     for unit in valves: 
      data['serial_numbers'].append(unit.serial_number) 
      data['mass'].append(unit.mass) 

     return data 

템플릿 :

<!-- templates/unit/data_plot.html --> 
{% extends "base.html" %} 

{% block extrahead %} 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 
    <script src="http://code.highcharts.com/highcharts.js"></script> 
{% endblock %} 

{% block rootcontainer %} 
    <div id="container" style="width:100%; height:400px;"></div>  
{% endblock %} 

{% block overwrite %} 
<!-- Overwrite the base.html jQuery load and put in head for Highcharts to work --> 
{% endblock %} 

{% block extrajs %} 
<script> 
$(document).ready(function() { 

    var options = { 
     chart: { 
      renderTo: 'container', 
      type: 'line' 
     }, 
     series: [{}] 
    }; 
    var ChartDataURL = "{% url 'chart_data_json' %}"; 
    $.getJSON('ChartDataURL', function(data) { 
     options.xAxis.categories = data['chart_data']['serial_numbers']; 
     options.series[0].name = 'Serial Numbers'; 
     options.series[0].data = data['chart_data']['mass']; 
     var chart = new Highcharts.Chart(options); 
    }); 

}); 
</script> 
{% endblock %} 

마지막으로 URL :

from unit import views, graphs 

urlpatterns = patterns('', 

    url(r'^chart_data_json/', views.chart_data_json, name = 'chart_data_json'), 

    url(r'^plot/', views.plot, name = 'plot'), 

) 

모든 것이 실행되는 것처럼 보이지만 Highchart 플롯은 렌더링되지 않습니다. 나는 JSON 데이터를 view.py에서 template.html로 어떻게 옮길 것인가에 대해 생각합니다. 그러나 오랫동안 그것을 꼼짝 않고 바라 보았습니다.

도움이 될 것입니다!

+1

콘솔에 오류가 있습니까? –

+0

@SebastianBochan 사이트를 검색 할 때 오류가 없습니다. 메인 URL과 데이터를 호출하는 URL 모두에 전형적인 200 응답을 받으십시오. – peteza33

답변

8

마침내 플로팅 작업을 마쳤습니다. 이 접근 방식은 here입니다. 그의 방법을 게시 한 덕분에 Harrison!

위의 방법에 따라 나의 새로운 views.py :

def plot(request, chartID = 'chart_ID', chart_type = 'line', chart_height = 500): 
    data = ChartData.check_valve_data() 

    chart = {"renderTo": chartID, "type": chart_type, "height": chart_height,} 
    title = {"text": 'Check Valve Data'} 
    xAxis = {"title": {"text": 'Serial Number'}, "categories": data['serial numbers']} 
    yAxis = {"title": {"text": 'Data'}} 
    series = [ 
     {"name": 'Mass (kg)', "data": data['mass']}, 
     {"name": 'Pressure Drop (psid)', "data": data['pressure drop']}, 
     {"name": 'Cracking Pressure (psid)', "data": data['cracking pressure']} 
     ] 

    return render(request, 'unit/data_plot.html', {'chartID': chartID, 'chart': chart, 
                'series': series, 'title': title, 
                'xAxis': xAxis, 'yAxis': yAxis}) 
데이터 데이터베이스 개체를 당기고 전달하는

빠른 기능 :

class ChartData(object):  
    def check_valve_data(): 
     data = {'serial numbers': [], 'mass': [], 
       'pressure drop': [], 'cracking pressure': [], 'reseat pressure': []} 

     valves = CheckValve.objects.all() 

     for unit in valves: 
      data['serial numbers'].append(unit.serial_number) 
      data['mass'].append(unit.mass) 
      data['cracking pressure'].append(unit.cracking_pressure) 
      data['pressure drop'].append(unit.pressure_drop) 
      data['reseat pressure'].append(unit.reseat_pressure) 

     return data 

해리슨의 방법의 핵심은에 매핑 스크립트를 Highcharts js를 Python 템플릿 변수로 변환 :

{% extends "base.html" %} 

{% block extrahead %} 
    <!-- Load in jQuery and HighCharts --> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 
    <script src="http://code.highcharts.com/highcharts.js"></script> 
{% endblock %} 

{% block heading %} 
    <h1 align="center">Analysis</h1> 
{% endblock %} 

{% block content %} 
    <div id={{ chartID|safe }} class="chart" style="height:100px; width:100%"></div> 
{% endblock %} 

{% block overwrite %} 
<!-- Overwrite the base.html jQuery load and put in head for Highcharts to work --> 
{% endblock %} 

{% block extrajs %} 
<!-- Maps the Python template context variables from views.py to the Highchart js variables --> 
<script> 
    var chart_id = {{ chartID|safe }} 
    var chart = {{ chart|safe }} 
    var title = {{ title|safe }} 
    var xAxis = {{ xAxis|safe }} 
    var yAxis = {{ yAxis|safe }} 
    var series = {{ series|safe }} 
</script> 

<!-- Highchart js. Variable map shown above --> 
<script> 
$(document).ready(function() { 
    $(chart_id).highcharts({ 
     chart: chart, 
     title: title, 
     xAxis: xAxis, 
     yAxis: yAxis, 
     series: series 
    }); 
}); 
</script> 
{% endblock %} 

ything은 올바르게 작동하고 올바르게 표시됩니다!

+0

이것은 훌륭합니다. 그러나 나는 그것을 사용하고 있습니다. xAxis가 날짜 인 경우 한 가지 문제. 서식을 시도했지만 js가 날짜로 인식하지 못합니다. – user1572215

+0

@ peteza33 돌아와서 당신을 위해 일한 솔루션으로 포스트를 업데이트 해 주신 명성. 분명히 거기에 장고 + Highchart 통합 예제는 많지 않으며이 게시물은 많은 도움이됩니다. 한 번 이상 upvote 수 있으면 좋겠다! – Anupam

+0

@ peteza33, @ user1572215 Django와 Highcharts에 대해 더 많이 배우고 있기 때문에 [this post] (http://pawamoy.github.io/2016/04/06/django-dashboard-with-suit-and-highcharts/) Django 뷰는 x 축의 내용과 y 축의 내용을 정의 할 필요가 없기 때문에 하이 차트 매개 변수를 js에 유지하는 것이 더 좋음을 알게되었습니다. 즉, tamplate에있는 프리젠 테이션 부분입니다. 당신의 코드에서와 마찬가지로,'render'의 컨텍스트는'data [ 'mass']','data [ 'pressure drop']'등을 포함합니다. – Anupam

관련 문제