Найти - Пользователи
Полная версия: Как внутри шаблонов использовать скобки?
Начало » Django » Как внутри шаблонов использовать скобки?
1 2
Олег
Такая проблема.
Для объектов f имеются отзывы otzyv. Непосредственно в шаблоне нужно сосчитать кол-во отфильтрованных отзывов, пишу так:

{{ f.otzyv_set.filter(mark=1)|length }}
Поскольку в документации Django описано этод метод, вот конкретная строка:
b.entry_set.filter(headline__contains='Lennon')
Но получаю за это ошибку:

TemplateSyntaxError at /

Could not parse some characters: f.otzyv_set.filter|(mark=1)||length

то есть ему не нравятся скобки, а как без низ записать никак не пойму.
Помогите пожалуйста.
AlexKiriukha
Мне кажется фильтровать в шаблоне неверно, это нарушение MVC. Другими словами выборку нужно делать в view.
Олег
AlexKiriukha
Мне кажется фильтровать в шаблоне неверно, это нарушение MVC. Другими словами выборку нужно делать в view.
Скорей всего, полностью соглашусь с Вами, но всё равно не могу сообразить как сделать то что мне надо. Попробую объяснить подробнее, наверняка есть простое решение.

В функции view делаю выборку всех объектов Firma (модель описывающая фирму)
vipfirms = Firma.objects.all()
return render_to_response('index.html', {'vipfirms': vipfirms, }, context_instance=RequestContext(request, ))
Есть еще модели Otzyv (отзывы о фирмах, в них поле Mark=1 -положительный отзыв, Mark=2 - отрицат.)

В ‘index.html’ мне нужно вывести список этих фирм, и к КАЖДОЙ написать, имеется столько-то положительных и столько-то отрицательных, то есть на ходу сосчитать сколько привязано Otzyv к каждой фирме, но с учетом поля Mark

вот так и тянутся руки написать
{% for f in vipfirms %}
Фирма: {{ f.brand }} имеет
Положительных: {{ f.otzyv_set.filter(mark=1)|length }} отзывов
Отрицательных: {{ f.otzyv_set.filter(mark=2)|length }} отзывов
Но не работает, как указывал выше
tmt
Во вьюшке:
vipfirms = Firma.objects.extra(
select={
'positive_count': 'SELECT COUNT(*) FROM "название таблицы Otzyv" WHERE "название таблицы Otzyv".firma_id = "название таблицы Firma".id and "название таблицы Otzyv".mark = 1',
'negative_count': 'SELECT COUNT(*) FROM "название таблицы Otzyv" WHERE "название таблицы Otzyv".firma_id = "название таблицы Firma".id and "название таблицы Otzyv".mark = 2'
},
)
В шаблоне:
{% for f in vipfirms %}
Фирма: {{ f.brand }} имеет
Положительных: {{ f.positive_count }} отзывов
Отрицательных: {{ f.negative_count }} отзывов
Более детально в документации - http://docs.djangoproject.com/en/1.2/ref/models/querysets/#extra-select-none-where-none-params-none-tables-none-order-by-none-select-params-none
AlexKiriukha
О, если я правильно понял, то можно использовать вот это.
lizzard
Мне кажется использование raw-sql - плохая практика в данном случае.
tmt
AlexKiriukha
О, если я правильно понял, то можно использовать вот это.
Правильно поняли. Только не уверен выйдет ли выбрать количество “положительных” и “отрицательных” одновременно в одном запросе. =)
Если удастса, покажите. =)
tmt
lizzard
Мне кажется использование raw-sql - плохая практика в данном случае.
Как будет выглядеть хорошая практика в данном случае? Покажите альтернативу? =)
sonniy
в одном запросе не получится
from django.db.models import Count
m1=model.objects.filter(mark=1).aggregate(Count('id'))
m2=model.objects.filter(mark=2).aggregate(Count('id'))
mark_1 = m1['id__count']
mark_2 = m2['id__count']
tmt
sonniy
в одном запросе не получится
from django.db.models import Count
m1=model.objects.filter(mark=1).aggregate(Count('id'))
m2=model.objects.filter(mark=2).aggregate(Count('id'))
mark_1 = m1['id__count']
mark_2 = m2['id__count']
Читаем внимательно условия задачи:
“Есть модель Firma (модель описывающая фирму)…
Есть еще модели Otzyv (отзывы о фирмах, в них поле Mark=1 -положительный отзыв, Mark=2 - отрицат.)…
…мне нужно вывести список этих фирм, и к КАЖДОЙ написать, имеется столько-то положительных и столько-то отрицательных,
то есть на ходу сосчитать сколько привязано Otzyv к каждой фирме, но с учетом поля Mark…”
А вы просто агрегировали количесто елементов по Mark, принимая что поле Mark находится в той же модели, что совсем не так.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB