Foros del Web » Programando para Internet » Python »

Gráfico con Highchart con los datos devueltos de una vista

Estas en el tema de Gráfico con Highchart con los datos devueltos de una vista en el foro de Python en Foros del Web. Buenas tardes. Estoy intentando realizar mi primera página web con django y me estoy encontrando con problemas. La página web muestra los datos recibidos (temperaturas, ...
  #1 (permalink)  
Antiguo 25/03/2016, 10:34
 
Fecha de Ingreso: marzo-2016
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Gráfico con Highchart con los datos devueltos de una vista

Buenas tardes.

Estoy intentando realizar mi primera página web con django y me estoy encontrando con problemas.
La página web muestra los datos recibidos (temperaturas, humedad, etc) desde unos arduinos y que se graban en una base de datos sqlite.
Tengo la plantilla que recibe los datos de la vista y los muestra en una tabla dentro de un div pero ahora me gustaría mostrar en otro div un gráfico creado con Highchart

¿como puedo recoger los datos recibidos de la vista e añadirlos a la gráfica? ¿cuales serían los pasos?

Saludos y gracias.
  #2 (permalink)  
Antiguo 25/03/2016, 22:00
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

1. Crea un view que devuelva un json que vas a graficar.
2. Haz un llamada ajax desde el frontend a la vista del paso 1 para obtener los datos.
3. Una vez que los obtengas los gráficas del lado del frontend.
  #3 (permalink)  
Antiguo 26/03/2016, 15:46
 
Fecha de Ingreso: marzo-2016
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Muchas gracias por la respuesta.

Una duda, me comentas que tengo que crear una view con los datos a mostrar en la gráfica y después tendría que llamar a la view desde la página para recuperar esos datos. ¿es así? ¿tengo que llamar a la vista desde la página con javascript (p.e)?

Supongo que las preguntas son muy básicas pero es la primera vez que me peleo con Django y todo lo que aprendí de programación es a nivel casero.

Saludos y gracias de nuevo.
  #4 (permalink)  
Antiguo 26/03/2016, 23:03
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Cita:
Una duda, me comentas que tengo que crear una view con los datos a mostrar en la gráfica y después tendría que llamar a la view desde la página para recuperar esos datos. ¿es así? ¿tengo que llamar a la vista desde la página con javascript (p.e)?
Si
  #5 (permalink)  
Antiguo 27/03/2016, 03:50
 
Fecha de Ingreso: marzo-2016
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Muchas gracias.

En cuanto pueda lo pruebo y ya comento los resultados o si me sale algún otro problema.

Saludos.
  #6 (permalink)  
Antiguo 27/03/2016, 04:21
 
Fecha de Ingreso: febrero-2008
Ubicación: Caravana
Mensajes: 455
Antigüedad: 16 años, 10 meses
Puntos: 30
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Si los datos ya los tienes en la vista no te hace falta volver a cargarlos, tendras que crear la grafica por javascript.
  #7 (permalink)  
Antiguo 27/03/2016, 04:45
 
Fecha de Ingreso: marzo-2016
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Muchas gracias por la información.

Yo paso los datos a la plantilla a través de esta vista:
Código Python:
Ver original
  1. def dispositivo_detail(request, pk):
  2.     datos = Datos.objects.filter(Dispositivo_id=pk).order_by('-Fecha')
  3.     return render(request, 'tc/dispositivo_detail.html', {'datos': datos})

Con esto ya puedo recoger los datos en javascript para crear los datos de HighChart?
¿como puedo acceder a esos datos con javascript? Estuve buscando pero no encuentro nada para ello.

En la plantilla la tabla la muestro con el siguiente código:
Código HTML:
Ver original
  1. <table class="table table-striped">
  2.         <thead>
  3.             <tr>
  4.                 <th>Fecha</th>
  5.                 <th>Temperatura</th>
  6.                 <th>Humedad</th>
  7.                 <th>Luz</th>
  8.             </tr>
  9.         </thead>
  10.        
  11.         {% for dato in datos %}
  12.         <tbody>
  13.             <tr>
  14.                 <td>{{ dato.Fecha|date:"d/m/Y H:i" }}</td>
  15.                 <td>{{ dato.Temperatura }}</td>
  16.                 <td>{{ dato.Humedad }}</td>
  17.                 <td>{{ dato.Luz }}</td>
  18.             </tr>
  19.             {% endfor %}
  20.         </tbody>
  21.     </table>

Pero no tengo claro como acceder a la variable {% datos %} con javascript. Me podéis indicar algo?

Saludos.
  #8 (permalink)  
Antiguo 27/03/2016, 05:18
 
Fecha de Ingreso: febrero-2008
Ubicación: Caravana
Mensajes: 455
Antigüedad: 16 años, 10 meses
Puntos: 30
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Accedes igual, por ejemplo:

Código:
$(function () {
    $('#container').highcharts({
        title: {
            text: 'Monthly Average Temperature',
            x: -20 //center
        },
        subtitle: {
            text: 'Source: WorldClimate.com',
            x: -20
        },
        xAxis: {
            categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        },
        yAxis: {
            title: {
                text: 'Temperature (°C)'
            },
            plotLines: [{
                value: 0,
                width: 1,
                color: '#808080'
            }]
        },
        tooltip: {
            valueSuffix: '°C'
        },
        legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'middle',
            borderWidth: 0
        },
        series: [{
            name: 'Tokyo',
            data: {{datosdetokio}}
        }, {
            name: 'New York',
            data: {{datosdenewyork}}
        }, {
            name: 'Berlin',
            data: {{datosdeberlin}}
        }, {
            name: 'London',
            data:{{datosdelondres}}
        }]
    });
  #9 (permalink)  
Antiguo 27/03/2016, 14:11
 
Fecha de Ingreso: marzo-2016
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Hola de nuevo.

Aquí sigo con mi intento de crear una gráfica con Highcharts pero por ahora todos los intentos son en vano. He intentado hacerlo aprovechando los datos ya pasados a la plantilla como indica lagardel pero no me muestra nada (div en blanco). Pongo el código que tango actualmente:
- Modelo:
Código Python:
Ver original
  1. class Datos(models.Model):
  2.     idDatos = models.AutoField
  3.     Dispositivo = models.ForeignKey('Dispositivo')
  4.     Temperatura = models.DecimalField(max_digits=5, decimal_places=2)
  5.     Humedad = models.DecimalField(max_digits=5, decimal_places=2)
  6.     Luz = models.DecimalField(max_digits=5, decimal_places=0)
  7.     Fecha = models.DateTimeField(blank=True, null=True)
- Vista:
Código Python:
Ver original
  1. def dispositivo_detail(request, pk):
  2.     datos = Datos.objects.filter(Dispositivo_id=pk).order_by('-Fecha')
  3.     return render(request, 'tc/dispositivo_detail.html', {'datos': datos})
- Script en plantilla:
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2.         var chart;
  3.         $(document).ready(function() {
  4.             chart = new Highcharts.Chart({
  5.                 chart: {
  6.                     renderTo: 'grafico',
  7.                     defaultSeriesType: 'line',
  8.                     margin: [50, 150, 60, 80]
  9.                 },
  10.                 title: {
  11.                     text: 'Datos sensores',
  12.                     style: {
  13.                         margin: '10px 100px 0 0' // center it
  14.                     }
  15.                 },
  16.                 xAxis: {
  17.                     categories: {{datos.Fecha}},
  18.                     title: {
  19.                         text: 'Fecha y Hora'
  20.                     }
  21.                 },
  22.                 yAxis: {
  23.                     title: {
  24.                         text: 'Valores'
  25.                     },
  26.                     plotLines: [{
  27.                         value: 0,
  28.                         width: 1,
  29.                         color: '#808080'
  30.                     }]
  31.                 },
  32.                 tooltip: {
  33.                     formatter: function() {
  34.                             return '<b>'+ this.series.name +'</b><br/>'+
  35.                             this.x +': '+ this.y;
  36.                     }
  37.                 },
  38.                 legend: {
  39.                     layout: 'vertical',
  40.                     style: {
  41.                         left: 'auto',
  42.                         bottom: 'auto',
  43.                         right: '10px',
  44.                         top: '100px'
  45.                     }
  46.                 },
  47.                 series: [{
  48.                     name: 'Temperatura',
  49.                     data: {{ datos.Temperatura }}
  50.                 }, {
  51.                     name: 'Humedad',
  52.                     data: {{ datos.Humedad }}
  53.                 }, {
  54.                     name: 'Luz',
  55.                     data: {{ datos.Luz }}
  56.                 }]
  57.             });
  58.         });    
  59. </script>

Entiendo que lo que falla es que no puedo acceder a los campos del modelo a través del formato {{datos.Campo_de_tabla}} pero no encuentro ninguna forma de acceder a estos campos directamente.
Intenté crear cuatro listas con los distintos valores pero error al intentarlo, cosa que en el shell de django si me sacaba la lista. El código que intenté hacer es:
Código Python:
Ver original
  1. temp = []
  2. humedad = []
  3. luz = []
  4. fecha = []
  5.  
  6. from tc.models import Datos
  7. datos = Datos.objects.filter(Dispositivo_id='AA:BB:CC:DD:EE:FF')
  8. for dato in datos:
  9.     temp.append(dato.Temperatura)
  10.     humedad.append(dato.Humedad)
  11.     luz.append(dato.Luz)
  12.     fecha.append(dato.Fecha

Supongo que esas cuatro listas si las paso como parámetros para el script funcionaría pero no soy capaz de crearlas dentro de la plantilla.

¿que estoy haciendo mal? Estoy muy perdido.

Saludos y gracias
  #10 (permalink)  
Antiguo 04/05/2016, 00:33
 
Fecha de Ingreso: noviembre-2015
Mensajes: 9
Antigüedad: 9 años, 1 mes
Puntos: 0
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Hola,

Yo también estoy trabajando con higtchart y no he hecho nada por javascripts.
Me he creado el views, y he cargado el html a través del load chartit.

Te pongo un ejemplo de mi ventana. Es importante que pongas esto en la ventana en el container.
{% load chartit %}
{{ cht|load_charts:"container" }}

De todas formas te paso el ejemplo completo por si te sirve.
plantilla.html

{% extends "bootstrap/layouts/12.html" %}
{% load crispy_forms_tags %}
{% load chartit %}
{{ cht|load_charts:"container" }}
{% load django_tables2 %}
{% block all %}

<form name="form1" action="" method="post" charset="utf-8"></form>{% csrf_token %}

<h4>Gráficas</h4>

<ul class="nav nav-tabs">
<li {% if not u %}class="active"{% endif %}><a href="#peticion" data-toggle="tab">Petición</a></li>
{% if u %}
<li class="active"><a href="#graficas" data-toggle="tab">Gráficas</a></li>
{% endif %}
</ul>

<script src="{{STATIC_URL}}js/perfilado/utils.js" ></script>
<script type="text/javascript" src="{{STATIC_URL}}js/jquery-latest.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}js/jquery.tablesorter.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.7.1.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}js/highcharts/js/highcharts.js"></script>
<br/>
<div class="tab-content">
<div class="tab-pane {% if not u %}active{% endif %}" id="peticion">
<h4>1. Introduzca la semana clave a partir de la cual buscar</h4>
{% crispy form %}
</div>
<div class="tab-pane {% if u %}active{% endif %}" id="graficas">
{% load chartit %}
{{ cht|load_charts:"container" }}
<div id='container'>Gráfico</div>

</div>
</div>
{% endblock %}

views.py
id_64_resoluc = datos_extraidos.objects.filter(id_serie=64)
id_58_entrad = datos_extraidos.objects.filter(id_serie=58)
id_70_stock = datos_extraidos.objects.filter(id_serie=69)

# id = datos_extraidos.objects.filter(id_serie__in=selecc ion)
# print "id: ", id

ds = DataPool(series=[{'options': {'source': id_64_resoluc}, 'terms': ['clave', {'Resueltas': 'valor'}]},{'options': {'source': id_58_entrad}, 'terms':[{'clave_2': 'clave', 'Entradas': 'valor'}]},{'options': {'source': id_70_stock}, 'terms': [{'clave_3':'clave', 'Stock': 'valor'}]}])
cht = Chart(datasource=ds, series_options = [{'options':{'type':'line', 'stacking': False }, 'terms':{'clave': ['Resueltas'], 'clave_2': ['Entradas'],'clave_3': ['Stock'] }}], chart_options = {'title': {'text': 'Peticiones España'},'xAxis': {'title': {'text': 'Semanas'}}})

except MySQLdb.Error, e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])

return render(request, 'perfilado/informes/graficas_espana/index.html', {'cht': cht})


models.py
class datos_extraidos(models.Model):

id_serie = models.IntegerField(db_column='id_serie',primary_k ey=True)
clave = models.IntegerField(db_column='clave')
valor = models.DecimalField(db_column='valor', max_digits=9, decimal_places=2)

class Meta:
db_table = u'datos_extraidos'

Espero te sirva
  #11 (permalink)  
Antiguo 06/05/2016, 11:37
 
Fecha de Ingreso: marzo-2016
Mensajes: 6
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Gráfico con Highchart con los datos devueltos de una vista

Muchas gracias.

Llevo un mes de mucho trabajo y no he podido mirarlo más. A ver si puedo trabajar sobre el proyecto esta semana.
Me apunto las indicaciones a ver si consigo hacerlo funcionar.

Saludos.

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:23.