2012-06-14 9 views
9

Los documentos dicen:no queryset ordenación de datos en Django-tables2

Where the table is backed by a model, the database will handle the ordering. Where this is not the case, the Python cmp function is used and the following mechanism is used as a fallback when comparing across different types: ...

Pero es esto posible en una tabla que se apoyada en un modelo, en una columna personalizada? p.ej.

class MyModel(models.Model): 
    x = models.IntegerField() 
    y = models.IntegerField() 

    def z(self): 
     return x+y 

class MyTable(tables.Table): 
    z = tables.Column() 
    class Meta: 
     model = MyModel 

Cuando intento algo como esto, la columna muestra bien, pero cuando hago clic en el encabezado de columna para ordenar, me sale este error:

Caught FieldError while rendering: Cannot resolve keyword u'z' into field. Choices are: ...

Al parecer, esto se debe a Z no se encuentra en la tabla de la base de datos

¿Hay alguna forma de evitar esto?

+2

Este es un error/falta de característica en django-tables2. ¿Te importaría agregar un problema a http://github.com/bradleyayers/django-tables2/issues por favor? Me he golpeado esto recientemente pero me olvidé de seguirlo. –

+0

Tenga en cuenta que [se abrió un problema] (https://github.com/bradleyayers/django-tables2/issues/82) pero este problema en particular no se ha solucionado. –

Respuesta

2

No puede usar un conjunto de consulta si está ordenando en un atributo que no tiene una columna de base de datos. Sin embargo, puedes pasar una lista a tu mesa.

Asumiendo que su models.py se parece a esto:

from django.db import models 

class MyModel(models.Model): 
    def foo(self): 
     return something_complex() 

usted podría tener tables.py que tiene este aspecto:

import django_tables2 as tables 
from .models import MyModel 

class MyModelTable(tables.Table): 
    foo = tables.Column() 

    class Meta: 
     model = MyModel 

Luego, en su views.py:

from django_tables2.config import RequestConfig 
from django.core.paginator import InvalidPage 
from django.shortcuts import render 

def view_my_models(request): 
    # use a list so django_tables2 sorts in memory 
    my_models = list(MyModel.objects.all()) 

    my_models_table = MyModelTable(my_models) 
    RequestConfig(request).configure(my_models_table) 

    try: 
     page_number = int(request.GET.get('page')) 
    except (ValueError, TypeError): 
     page_number = 1 

    try: 
     my_models_table.paginate(page=page_number, per_page=10) 
    except InvalidPage: 
     my_models_table.paginate(page=1, per_page=10) 

    template_vars = {'table': my_models_table} 
    return render(response, "view_my_models.html", template_vars) 

También hay an open ticket discussing this issue.

+0

convirtiendo el conjunto de preguntas en una lista que trabajé para mí, ¡gracias por ese consejo! – Matt

Cuestiones relacionadas