Даты набора запросов Django: агрегировать и форматировать месяцы в виде строк имен - PullRequest
2 голосов
/ 02 ноября 2010

У меня есть простое приложение для блога, которое я портирую на Django. Один камень преткновения, с которым я столкнулся, - это агрегация записей статей по месяцам и отображение их в виде списка. Каждая статья в БД имеет простое поле даты и времени. Вывод HTML должен выглядеть примерно так:

2010

  • Январь (3 записи)
  • Февраль (2 записи)
  • март (3 записи)

и т.д.

В настоящее время я использую блок {% foreach%} в шаблоне для циклического прохождения всех месяцев, возвращаемых запросом.

Движение с датами ('datetamp', 'month') кажется правильным направлением, но как мне получить количество статей в результатах и ​​как я отформатирую целые числа месяца, чтобы они были строками имен в шаблоне?

1 Ответ

0 голосов
/ 02 ноября 2010

Для этого вы можете использовать Джанго-куб .С помощью следующего кода в вашем views.py (а затем подключите entry_count в ваших URL), вы должны получить то, что вам нужно:

# cube declaration
from cube.models import Cube, Dimension

class EntryCube(Cube):

    #replace <your_date_field> by the field name
    month = Dimension('<your_date_field>__month') 
    year = Dimension('<your_date_field>__year')

    @staticmethod
    def aggregation(queryset):
        return queryset.count()

# views declaration
from .models import <YourModel> #replace by your model
from cube.views import table_from_cube

def entry_count(request):
    cube = EntryCube(<YourModel>.objects.all())
    return table_from_cube(request, cube, ['year', 'month'], template='table.html')
    #template 'table.html' is in 'example/template' folder, copy it in your template folder, and modify it to your wish.

РЕДАКТИРОВАТЬ:

Если выЕсли вы хотите настроить способ отображения размеров, вы можете просто создать подкласс Dimension (см. этот фрагмент ):

class MonthDimension(Dimension):

    @property
    def pretty_constraint(self):
        #just return the month name according to the month number that you can get in "self.constraint", e.g. self.constraint = 1 -> return 'january'
        return month_name

(я планирую предоставить подклассы измерений, чтобы разрешить различные форматы, напримерчто вам нужно. Поэтому, если вы используете django-cube и пишете хороший подкласс Dimension для форматирования дат, я был бы рад взглянуть на это!)


Хорошо ..Это слишком для того, что вы хотите.Однако, если после этого вы решите, что вам нужно больше статистики для ваших записей (например, количество записей / автор / месяц / год / тег и т. Д.), Вы просто добавляете измерение в куб.Если вы решили использовать это, и вам нужна дополнительная помощь, пожалуйста, спросите!

...