【问题标题】:Non-queryset data ordering in django-tables2django-tables2 中的非查询集数据排序
【发布时间】:2012-06-14 01:30:08
【问题描述】:

文档说:

如果表由模型支持,则数据库将处理排序。如果不是这种情况,则使用 Python cmp 函数,并在比较不同类型时使用以下机制作为后备:...

但这是否可能在一个由模型支持的表中 在自定义列上?例如

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

当我尝试这样的事情时,该列显示 OK,但是当我单击列标题进行排序时,我收到此错误:

渲染时捕获 FieldError:无法将关键字 u'z' 解析为字段。选择是:...

显然这是因为在数据库表中没有找到z。

有没有办法解决这个问题?

【问题讨论】:

标签: django django-tables2


【解决方案1】:

如果您对没有数据库列的属性进行排序,则不能使用查询集。不过,您可以将列表传递给您的表。

假设你的 models.py 看起来像这样:

from django.db import models

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

您可以拥有如下所示的 tables.py:

import django_tables2 as tables
from .models import MyModel

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

    class Meta:
        model = MyModel

然后在你的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)

还有an open ticket discussing this issue。

【讨论】:

  • 将查询集转换为列表对我有用,感谢您的提示!
猜你喜欢
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多