2014-09-17 2 views
1

Я пытаюсь вернуть счет регистра на продажу в шаблоне. Я использую ListView. И мне нужны обратные счетчики продаж.Счет объектов с ListView

Стараюсь

#models.py 
class Sale(models.Model): 
    customer = models.ForeignKey(Customer) 
... 
    def __unicode__(self): 
     return unicode(self.date_sale) 

... 
    @property 
    def get_counter(self): 
     return Sale.objects.count() 

#views.py 
class SaleList(ListView): 
    template_name = 'sale_list.html' 
    model = Sale 
    context_object = 'sale_list' 
    paginate_by = 10 

#sale_list.html 
{{ sale.get_counter }} 

, но не работает.

Как вернуть счетный реестр Продажи?

ответ

1

Попробуйте

class SaleList(ListView): 
    template_name = 'sale_list.html' 
    model = Sale 
    context_object = 'sale_list' 
    paginate_by = 10 

    def get_context_data(self, **kwargs): 
     context = super(SaleList, self).get_context_data(**kwargs) 
     context['count'] = self.get_queryset().count() 
     return context 

Если шаблон

{{ count }} 
+0

Отлично, спасибо @nnmware. –

+0

Рад помочь. :) О проблеме с решением проблемы, то вы вызываете метод объекта, но ListView отправляет в список шаблонов объектов. Если вы получаете object_list в шаблоне, нужно написать {{object_list.0.get_counter}} (нужно использовать один объект) – nnmware

+0

Я заметил, что это решение добавляет дополнительный запрос к базе данных для получения общего счета (через панель инструментов Django Debug). Есть ли способ избежать лишнего попадания в базу данных? –

2

Вам не нужно get_counter функцию или даже переписать функцию get_context.

элемент управления ListView будет вызывать шаблон с object_list (или в случае, sales_list), который является QuerySet, поэтому все, что вам нужно, чтобы получить доступ к функции count() непосредственно из шаблона.

Так, просто используйте следующий на шаблоне:

{{ sales_list.count }} 
+0

Я использую разбиение на страницы, а sales_list.count возвращает только этот рендер itens. Для всех регистров я использовал get_context_data. Но спасибо всем. –

2

Лучшее решение этой проблемы заключается в использовании:

{{ page_obj.paginator.count }} 

Это позволяет избежать удара к базе данных еще раз только, чтобы получить счет, который уже был доступен в page_obj.

Смежные вопросы