2012-02-09 28 views
5

Tengo un modelo que se define como se muestra, que actúa sobre una consulta y obtiene una lista de objetos que deben colocarse en las celdas apropiadas de una tabla. Aquí está la parte relevante del código.cómo renderizar un Queryset en una plantilla de tabla-django

class Location(models.Model): 
    x=models.IntegerField(null=True) 
    y=models.IntegerField(null=True) 
    z=models.CharField(max_length=5,null=True) 

    def __unicode__(self): 
     return self.z 

De este db quiero recuperar todos los objetos y colocarlos en un 2d-mesa con la fila y la columna definida por x, y de que object.If no hay ningún objeto con certeza (x, y), entonces ese espacio en particular debe mostrarse vacío en la tabla. Esta es la vista que escribí para cumplir esos fines.

def gettable(request): 
    events=[] 
    for xdim in xrange(3): 
     xe=[] 
     for ydim in xrange(3): 
      object=[0] 
      object.append(Location.objects.filter(x=xdim,y=ydim)) 
      xe.append(object[-1]) 
      events.append(xe) 
    return render(request, 'scheduler/table.html', {'events':events}) 

Aquí es la parte del código html

<table border="1"> 
    <th>Header 0</th> 
    <th>Header 1</th> 
    <th>Header 2</th> 
    {% for event in events %} 
    <tr> 
    {% for x in event %} <td>{{ x }}</td> 
    {% endfor %} 
    </tr> 
    {% endfor %} 
</table> 

Tengo que hacer frente a varios problemas aquí.

1. Mi código para vistas no es del todo elegante (lo cual es malo, ya que sé que django ofrece muchas cosas para abordar tales tareas) ya que estoy definiendo variables específicamente para recorrer en lugar de tomarlas del (x, y) valores de los objetos de la base de datos.

2. Obtengo la salida en formato [<Location: 21>] pero la quiero como '21'.

3.¿Cómo introduzco celdas vacías donde no existe ningún objeto para given (x, y).

4. Sugiera cualquier otra forma posible que pueda hacer que mi código sea más simple y general.

Respuesta

14

Si desea simplificar su código, me gustaría recomendar el uso de la aplicación django-tables2. Este enfoque puede resolver todos sus problemas sobre la generación de tablas.

Como documentación de EFS:

django-tables2 simplifica la tarea de convertir conjuntos de datos en HTML tablas. Tiene soporte nativo para paginación y clasificación. Lo hace para las tablas HTML lo que hace django.forms para formularios HTML. p.ej.

Sus características incluyen:

  • Cualquier iterables puede ser una fuente de datos, pero el apoyo especial para QuerySets Django está incluido.
  • La interfaz de usuario integrada no depende de JavaScript.
  • Compatibilidad con la generación automática de tablas basada en un modelo de Django.
  • Admite la funcionalidad de columna personalizada a través de subclases.
  • Paginación.
  • Clasificación de tablas basada en columnas.
  • Etiqueta de plantilla para habilitar la representación trivial en HTML.
  • Mezcla de vista genérica para usar en Django 1.3.

Creación de una tabla es tan simple como:

import django_tables2 as tables 

class SimpleTable(tables.Table): 
    class Meta: 
     model = Simple 

Esto entonces se utilizaría en una vista:

def simple_list(request): 
    queryset = Simple.objects.all() 
    table = SimpleTable(queryset) 
    return render_to_response("simple_list.html", {"table": table}, 
           context_instance=RequestContext(request)) 

Y finalmente en la plantilla:

{% load django_tables2 %} 
{% render_table table %} 

Este ejemplo muestra uno de los casos más simples, pero d jango-tables2 puede hacer mucho más! Compruebe fuera de documentation para más detalles.

También es posible utilizar el diccionario en lugar de queryset.

1

por punto:

  1. OMI que puede salirse con la creación de un filtro personalizado o una etiqueta y con el conjunto de consultas.
  2. Debe definir un método __unicode__ (o __string__) para devolver el artículo deseado.
  3. Si el valor está vacío o el artículo no existe, el resultado representado también estará vacío.

HTH

1

Para el punto 2, que está dando cada célula una lista en lugar de un único objeto, {{}} x.0 debe darle el valor correcto, pero también sugiere que estés acercándolo mal en su lógica de vista.

Cuestiones relacionadas