Я показываю количество результатов поиска, но выполняю более одного поиска. Итак, чтобы отобразить количество результатов, мне пришлось бы их сложить. Итак, я пробовал это:

<p>Found {{ products|length + categories|length + companies|length }} results.</p>

Но я получаю сообщение об ошибке. Как мне это сделать?

3
R0b0tn1k 5 Июн 2009 в 13:23

3 ответа

Лучший ответ

Я бы сделал это на ваш взгляд, когда вы создаете свой контекстный словарь:

'result_count': len(products) + len(categories) + len(companies)

Затем в вашем шаблоне просто используйте:

<p>Found {{ result_count }} results.</p>
3
Van Gale 5 Июн 2009 в 13:42

Шаблоны Django не поддерживают арифметические операторы. Однако вы можете использовать фильтр добавить. Думаю, вам нужно что-то вроде этого:

<p>Found {{ products|length|add:categories|length|add:companies|length }} results.</p>

В качестве альтернативы вы должны вычислить общую сумму в представлении и передать ее предварительно рассчитанной в шаблон.

РЕДАКТИРОВАТЬ: В дополнение к комментариям эта версия должна работать:

{% with categories|length as catlen %}
{% with companies|length as complen %}   
<p>Found {{ products|length|add:catlen|add:complen }} results.</p>
{% endwith %}
{% endwith %}

Однако это кажется очень хакерским, и было бы предпочтительнее вычислять цифру в представлении.

6
msanders 5 Июн 2009 в 14:34
Когда я пробую blah|length|add:blarg|length, я получаю TemplateSyntaxError «int () arg должен быть строкой или числом».
 – 
krubo
5 Июн 2009 в 13:53
Ваше предложение вызывает ошибку: аргумент int () должен быть строкой или числом, а не QuerySet.
 – 
R0b0tn1k
5 Июн 2009 в 14:29
Я заставил его работать (см. Отредактированный ответ), но вам лучше рассчитать его в представлении.
 – 
msanders
5 Июн 2009 в 14:35

Хочу отметить, что ответ Ван Гейла не оптимален. Из документации QuerySet API следует использовать запрос. count () вместо len (query)

Вызов count () выполняет SELECT COUNT (*) за кулисами, поэтому вам всегда следует использовать count (), а не загружать всю запись в объекты Python и вызывать len () для результата (если вам не нужно загружать объекты в любом случае в память, и в этом случае len () будет быстрее).

Итак, ответ должен быть таким: В представлении:

'result_count': products.count() + categories.count() + companies.count()

Шаблон остается без изменений

3
Labarbiche 20 Июн 2012 в 20:15