12

ドキュメントは言う:

テーブルがモデルによってサポートされている場合、データベースが順序付けを処理します。そうでない場合は、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 が見つからないためです。

これを回避する方法はありますか?

4

1 に答える 1

4

データベース列を持たない属性を注文する場合、クエリセットは使用できません。ただし、テーブルにリストを渡すことはできます。

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)

この問題について議論しているオープン チケットもあります。

于 2013-08-13T14:10:25.983 に答える