Страница архива Django Year / Month с общими видами - PullRequest
0 голосов
/ 16 февраля 2011

Хотите сделать общий просмотр архивной страницы по месяцам и годам. Как это:

2011 - January March
2010 - October December

Что я получаю:

2011 - January January
2010 - January January

Возможно ли это? Вот виды и шаблоны.

вид

def track_archive(request):
    return date_based.archive_index(
        request,
        date_field='date',
        queryset=Track.objects.all(),
  )
track_archive.__doc__ = date_based.archive_index.__doc__

template
{% for year in date_list %}
        <a href="{% url track_archive %}{{ year|date:"Y" }}/">{{ year|date:"Y" }}</a> archives:
        {% for month in date_list %}
            <a href="{% url track_archive %}{{ year|date:"Y" }}/{{ month|date:"b" }}/">{{ month|date:"F" }}</a>
        {% endfor %}
    {% endfor %}

Ответы [ 2 ]

4 голосов
/ 03 мая 2012

Вы можете сделать это и придерживаться общих представлений - если вы используете общие представления на основе классов.

Вместо использования ArchiveIndexView используйте что-то вроде

class IndexView(ArchiveIndexView):
    template_name="index.html"
    model = Article
    date_field="created"

    def get_context_data(self, **kwargs):
        context = super(IndexView,self).get_context_data(**kwargs)
        months = Article.objects.dates('created','month')[::-1]

        context['months'] = months
        return context

Затем в вашем шаблоне вы получитесловарь месяцев, который вы можете сгруппировать по годам ::

 <ul>
    {% for year, months in years.items %}
     <li> <a href ="{% url archive_year year %}"> {{ year }} <ul>
        {% for month in months %}
            <li> <a href ="{% url archive_month year month.month %}/">{{ month|date:"M Y" }}</a> </li>
        {% endfor %}
        </ul>
     </li>
    {% endfor %}
 </ul>
3 голосов
/ 17 февраля 2011

Согласно doc , archive_index рассчитывает только годы.Возможно, вы захотите написать группировку год / месяц:

def track_archive(request):
   tracks = Track.objects.all()
   archive = {}

   date_field = 'date'

   years = tracks.dates(date_field, 'year')[::-1]
   for date_year in years:
       months = tracks.filter(date__year=date_year.year).dates(date_field, 'month')
       archive[date_year] = months

   archive = sorted(archive.items(), reverse=True)

   return date_based.archive_index(
        request,
        date_field=date_field,
        queryset=tracks,
        extra_context={'archive': archive},
   )

Ваш шаблон:

{% for y, months in archive %}
<div>
  {{ y.year }} archives: 
  {% for m in months %}
    {{ m|date:"F" }}
  {% endfor %}
</div>
{% endfor %}

y и m являются объектами даты, вы должны иметь возможность извлекать любую информацию о формате даты вСоздайте свои URL.

...