2011-09-14 2 views
2

私はdjango-tables(http://pypi.python.org/pypi/django-tables/0.2)を使ってMySQLテーブルの内容をレンダリングしています。Django:django_tablesはメソッドをソート

テーブルにマップされるモデルには、変換関数である2つの関数、または行の内容の集計があります。例えば

class Example(models.Model): 

    STATUS_1 = 0 
    STATUS_2 = 1 
    STATUS_3 = 2 

    STATUS_CHOICES = ( 
       (STATUS_1, _('Status One')), 
       (STATUS_2, _('Status Two')), 
       (STATUS_3, _('Status Three')), 
      ) 


    #This gives a nice drop down when rendered in a form... 
    status = models.IntegerField(choices=STATUS_CHOICES, 
          default=STATUS_1, 
          verbose_name=_('Status')) 

    #This is the function to produce the text for a choice... 
    def status_text(self): 
     return self.STATUS_CHOICES[self.status][1] 

    #A function that inspects items that link to 'Example' 
    #and creates an aggregate string value 
    def openissues(self): 
     answer = _("No") 
     linked_issues = self.issues.all() 
     for thisissue in linked_issues: 
      if (not thisissues.resolved): 
       answer = _("Yes") 
       break 

     return answer 

は、その後、私は持っている私のテーブルのクラス定義で:

import django_tables 
from django.utils.translation import ugettext_lazy as _ 

class ExampleTable(django_tables.ModelTable): 
    . 
    . 
    status_text = django_tables.Column(verbose_name=_('Status')) 
    openissues = django_tables.Column(verbose_name=_('Open Issues')) 
    . 
    . 

私の見解は次のように構築されています:

def decision_list(request): 
    . 
    . 
    objects = Example.objects.all() 
    table = ExampleTable(objects, order_by=request.GET.get('sort')) 
    return render_to_response('example_list.html', 
     RequestContext(request, dict(example=example))) 

そして最後に、テンプレートがどのように見えますこれは:

<table id="example-list" cellspacing="0"> 
<tr> 
    {% for column in example.columns %} 
<th id="{{ example.name }}"{% if example.is_ordered_straight %} class="sorted straight"{% endif %}{% if column.is_ordered_reverse %} class="sorted reverse"{% endif %}><a href="?sort={{ column.name_toggled }}">{{ column }}</a></th> 
    {% endfor %} 
</tr> 
{% for thisexample in example.rows %} 
    <tr> 
     <td>{{ thisexample.id }}</td> 
     <td><a href="{% url a_url %}">{{thisexample.name}}</a></td> 
     <td>{{ thisexample.status_text }}</td> 
     <td>{{ thisexample.openissues }}</td> 

    </tr> 
{% endfor %} 
</table> 

(注:私は唯一の関連する部分を含むように、コードビットを編集した、そして理解しやすいかもしれませんので、より汎用的なものを名前を変更)あなたがうまくいけば、私が欲しい見ることができるように、

とにかくユーザーが列見出しをクリックすると、 'status_text()'と 'openissues()'メソッドをソートできるようになりました。

これは機能しません。 django_tablesため

ドキュメントは言う:

「カスタムカラムは関係なく、sortable財産(それは無視される)の、順序をサポートしていないモデルフィールドに基づいていません。」

ユーザーがモデル関数をソートできる方法はありますか?これは、多くの人々がやりたいと思うようなものです。

答えて

0

djangoのORMレイヤの重要な特性は、QuerySetオブジェクトの並べ替えとフィルタリングが常にDBMS上で実行されることです。 モデルクラス内のメソッドまたはプロパティは、アプリケーションサーバー上で評価され、データベース列にマップされません。したがって、これらを並べ替えることはできません。

関連する問題