Django Template Slice - обратный порядок

В WORDPRESS:

global $wpdb;   $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
  var_dump( $column_name );
}
10
задан TheLizardKing 14 December 2009 в 02:22
поделиться

4 ответа

Запросы к базе данных Django обрабатываются лениво, поэтому результат thread.comment_set .all - это QuerySet, а не список. QuerySet поддерживает множество функций, подобных списку, но не отрицательное срезы, поэтому ошибка индексирования не исходит от самого фильтра шаблона. (Если вам интересно, срезы объектов QuerySet преобразуются в предложение limit в операторе SQL, вот почему вы не можете использовать отрицательное число).

В общем, Django поощряет строгое разделение шаблонов и моделей; модуль views.py - это связующее звено, на котором вы выполняете любую работу, требующую знания моделей баз данных и методов набора запросов для преобразования данных вашей модели в простые переменные и структуры для шаблона.

Выполнение связанного запроса к модели из шаблона - это не то, что вы обычно видите в шаблоне Django, и для этого есть веская причина. Прямо сейчас может показаться очень простым вырезать последние три элемента из comment_set. Однако имейте в виду, что база данных не будет возвращать результаты ни в каком гарантированном порядке. Это означает, что в дополнение к вашему фрагменту теперь вам также необходимо добавить предложение order_by; просто нет способа выразить это в шаблоне, да и быть не должно. Лучше думать о представлении как о переводе между вашей моделью и шаблоном и позволять выполнять такую ​​работу с базой данных там, а не встраивать в HTML.

В этом случае я бы посоветовал вам передать упорядоченный фрагмент в ваш шаблон из представления:

# take first three sorted descending
comments = thread.comment_set.order_by('-something')[:3]

context = Context({'comments':comments})
return HttpResponse(tmplt.render(context))

Если вам необходимо выполнить нарезку в шаблоне, и вы действительно не заботитесь о сортировке результатов, передайте список в шаблон. Фильтр slice с радостью выполнит отрицательное срезы:

comments = list(thread.comment_set.all())
context = Context('comments':comments)

В шаблоне:

{% for comment in comments|slice:"-3:" %}
13
ответ дан 3 December 2019 в 16:29
поделиться

Используйте атрибут «ordering» класса Meta класса Comment, чтобы установить требуемый порядок элементов.

Шаблоны IMO - не подходящее место для упорядочивания набора данных. Заказ следует оформлять либо в моделях, либо в видах.

1
ответ дан 3 December 2019 в 16:29
поделиться

Я не видел, чтобы фильтр dictsortreversed использовался слишком часто, и, согласно документам, для сортировки требуется ключ автор

{% for comment in thread.comment_set.all|dictsortreversed:"name"|slice:"3" %}
10
ответ дан 3 December 2019 в 16:29
поделиться

Разве вы не можете просто разрезать список перед тем, как передать его в шаблон?

0
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: