2015-01-07 11 views
5

İlk kez poster, uzun süre okuyucusu. Bir süreliğine cevap aramak için harcadım, ki bu da bana temel bir şey olduğunu düşünmüyorum.Django Veritabanı Queryset'in JSON ile Highcharts'a Aktarılması

Bir veritabanı tablosunda tutulan verileri çekmeye çalışıyorum ve bir Highcharts grafiğinde görüntülemek için iletiyorum. Kaynak incelerken Django'dan veya müşteri tarafından herhangi bir hata almıyorum.

kullanılması: Django 1.7 ve Python 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() işlevi:

#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 

şablonu:

<!-- 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 %} 

Sonunda 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'), 

) 

Her şey çalışıyor gibi görünüyor, ancak Highchart grafiği oluşmuyor. JSON verilerini nasıl view.py'den template.html'ye taşıdığımı düşünüyorum, ancak o kadar uzun bir süre sonra baktığımda çapraz gözlere bakıyorum.

Herhangi bir yardım harika olurdu!

+1

Konsolda herhangi bir hata var mı? –

+0

@SebastianBochan Site alındığında hata yok. Hem ana URL'ye hem de URL'yi arayarak normal bir 200 yanıt alın – peteza33

cevap

8

Sonunda çizimimi yaptım. Bu yaklaşımı here buldum. Onun yöntemini göndermek için Harrison için teşekkürler!

yukarıdaki yaklaşımına dayalı Benim yeni 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}) 
verileri veritabanı nesneleri çekerek ve geçme

Hızlı fonksiyonu:

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 

Harrison'un yönteme anahtar bir haritalama script Highcharts js'yi Python şablon değişkenlerine çevir:

{% 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 %} 

Hiç ything şimdi çalışır ve doğru görüntüler!

+0

Bu harika. Ama ben bile kullanıyorum. Sadece bir problem xAxis bir tarihse ne yapmalı. Denenmiş biçimlendirme ancak js bunu tarih olarak tanımıyor. – user1572215

+0

@ peteza33 Sizin için çalışan çözümle gönderiyi geri almak ve güncellemek için Kudos. Görünüşe göre pek çok Django + Highchart entegrasyon örneği yok ve bu yazı çok işe yarıyor. Keşke bir kereden fazla kazanabilseydim! – Anupam

+0

@ peteza33, @ user1572215 Django ve Highcharts hakkında daha fazla şey öğrenirken, [bu yazı] (http://pawamoy.github.io/2016/04/06/django-dashboard-with-suit-and-highcharts/) bana, sadece Django görünümünün x ekseninde ne olduğunu ve y ekseninde ne olduğunu tanımlaması gerekmediği için yüksek grafik parametrelerini js'de tutmanın daha iyi olduğunu fark ettim. Kodunuzda olduğu gibi, 'render' içindeki içerik yalnızca 'data [' mass '] ',' data [' pressure drop '] 'vb. Içerecektir. – Anupam

İlgili konular