2012-06-14 18 views
9

Docs powiedzieć:dla queryset uporządkowanie danych w 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: ...

Ale czy jest to możliwe w tabeli jest poparte modelu, na kolumnie zwyczaj? na przykład

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 

Kiedy próbuję coś takiego, kolumna wyświetla OK, ale po kliknięciu na nagłówek kolumny, aby posortować, otrzymuję ten błąd:

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

Podobno to dlatego oo nie znaleziono w tabeli bazy danych.

Czy istnieje sposób obejścia tego?

+2

To jest błąd/brak funkcji w django-tables2. Czy mógłbyś dodać problem do http://github.com/bradleyayers/django-tables2/issues? Udało mi się to ostatnio, ale zapomniałem o tym. –

+0

Należy pamiętać, że [problem został otwarty] (https://github.com/bradleyayers/django-tables2/issues/82), ale ten konkretny problem nie został naprawiony. –

Odpowiedz

2

Nie można użyć zestawu zapytań, jeśli zamawiasz atrybut, który nie ma kolumny bazy danych. Możesz jednak przekazać listę do swojej tabeli.

Zakładając, że models.py wygląda następująco:

from django.db import models 

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

Można mieć tables.py, który wygląda tak:

import django_tables2 as tables 
from .models import MyModel 

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

    class Meta: 
     model = MyModel 

Następnie w 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) 

Istnieje również an open ticket discussing this issue.

+0

Konwertowanie zestawu zapytań do listy działało dla mnie, dzięki za tę wskazówkę! – Matt

Powiązane problemy