Django Year/Month archive page with generic views
Looking to make a generic view archive page by month and year. Like this:
2011 - January March
2010 - October December
What I am getting:
2011 - January January
2010 - January January
Is this possible? Here are the views and templates.
view
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" }}/">{{ m开发者_开发技巧onth|date:"F" }}</a>
{% endfor %}
{% endfor %}
According to the doc, archive_index
only calculates the years. You might want to write the year/month grouping:
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},
)
Your template:
{% for y, months in archive %}
<div>
{{ y.year }} archives:
{% for m in months %}
{{ m|date:"F" }}
{% endfor %}
</div>
{% endfor %}
y and m are date objects, you should be able to extract any date format information to construct your urls.
You can do it and stick with generic views - if you use class based generic views.
Instead of using ArchiveIndexView use something like
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
Then in your template, you get the months dictionary, which you can group by year::
<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>
精彩评论