Django: сортировка django_tables по методу - PullRequest
2 голосов
/ 14 сентября 2011

Я использую django-таблицы (http://pypi.python.org/pypi/django-tables/0.2) для визуализации содержимого таблицы MySQL.

Модель, в которую отображается таблица, содержит пару функций, которые являются функциями преобразования, или агрегатамисодержимое строк.

Например:

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(игнорируется). "

Есть ли способ, которым яможет позволить пользователю сортировать по функциям модели?Это похоже на то, что многие люди хотели бы сделать.

1 Ответ

0 голосов
/ 14 марта 2012

Важным свойством слоя ORM в django является то, что сортировка и фильтрация объектов QuerySet всегда выполняются в СУБД.Метод или свойство в классе модели оценивается на сервере приложений и не сопоставляется со столбцом базы данных.Следовательно, вы не можете сортировать по ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...