django博客归档、索引和分页综合应用
django blog archive, index and pagination comprehensive application
背景:
我正在建立一个关于我的研究小组的博客。在出版物档案页面上,我将展示我导师的所有出版物。这里有一个侧栏显示档案索引,允许用户按年份查看出版物。在页面底部有一个 django 分页器,它将出版物分成几页,每页 7 个出版物。
问题:
当使用分页时,发布被分成一个列表,所以{{publication.published_time}}只包含当前页面的数据,而不是整个数据集。于是,我在前端写了年份信息的硬编码,在对应的年份加上url。
显然,我希望我能根据分页器的存在获得所有出版物的不同年份信息。此外,直接在URL.
中传递年份值
代码:
url.py
:
url(r'^publications/(?P<year>[0-9]{4})/$', PublicationYearArchiveView.as_view(),
name="publication_year_archive"),
views.py
:
class PublicationYearArchiveView(YearArchiveView):
queryset = Publication.objects.all()
date_field = "published_time"
make_object_list = True
allow_future = True
def listing(request):
limit = 7
publication_list = Publication.objects.all().order_by('published_time').reverse()
paginator = Paginator(publication_list, limit) # Show 7 publications per page
page = request.GET.get('page')
try:
publications = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
publications = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
publications = paginator.page(paginator.num_pages)
return render(request,
'research_spacecoupe/research_accomplishment.html',
{'publications': publications})
research.html
:
分页器:
{% if publications.has_other_pages %}
<ul class="pagination">
{% if publications.has_previous %}
<li><a href="?page={{ publications.previous_page_number }}">«</a></li>
{% else %}
<li class="disabled"><span>«</span></li>
{% endif %}
{% for i in publications.paginator.page_range %}
{% if publications.number == i %}
<li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
{% else %}
<li><a href="?page={{ i }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
{% if publications.has_next %}
<li><a href="?page={{ publications.next_page_number }}">»</a></li>
{% else %}
<li class="disabled"><span>»</span></li>
{% endif %}
</ul>
{% endif %}
索引:
<div class="sidebar-module">
<h4>Archive</h4>
<ol class="list-unstyled">
<li><a href="{% url 'research_spacecoupe:listing' %}">all publications</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2017 %}">2017</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2016 %}">2016</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2015 %}">2015</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2013 %}">2013</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2012 %}">2012</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2011 %}">2011</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2010 %}">2010</a></li>
</ol>
</div>
注:
现在页面可以运行了,我可以点击年份(例如 2017)查看 2017 年发布的出版物,点击 "All publications" 查看所有出版物。但我想用所有出版物的不同 publications.published_time 替换年数。我能做些什么来修复它吗?
views.py
:
from django.db.models.functions import ExtractYear
from django.db.models import Count
# ...
def listing(request):
# ...
years = Publication.objects \
.annotate(year=ExtractYear('published_time')) \
.values_list('year') \
.annotate(count=Count('id')) \
.values_list('year', flat=True) \
.order_by('year')
return render(request,
'research_spacecoupe/research_accomplishment.html',
{'publications': publications,
'years': years})
research_accomplishment.html
:
<div class="sidebar-module">
<h4>Archive</h4>
<ol class="list-unstyled">
<li><a href="{% url 'research_spacecoupe:listing' %}">all publications</a></li>
{% for year in years %}
<li><a href="{% url 'research_spacecoupe:publication_year_archive' year %}">{{ year }}</a></li>
{% endfor %}
</ol>
</div>
背景:
我正在建立一个关于我的研究小组的博客。在出版物档案页面上,我将展示我导师的所有出版物。这里有一个侧栏显示档案索引,允许用户按年份查看出版物。在页面底部有一个 django 分页器,它将出版物分成几页,每页 7 个出版物。
问题:
当使用分页时,发布被分成一个列表,所以{{publication.published_time}}只包含当前页面的数据,而不是整个数据集。于是,我在前端写了年份信息的硬编码,在对应的年份加上url。 显然,我希望我能根据分页器的存在获得所有出版物的不同年份信息。此外,直接在URL.
中传递年份值代码:
url.py
:
url(r'^publications/(?P<year>[0-9]{4})/$', PublicationYearArchiveView.as_view(),
name="publication_year_archive"),
views.py
:
class PublicationYearArchiveView(YearArchiveView):
queryset = Publication.objects.all()
date_field = "published_time"
make_object_list = True
allow_future = True
def listing(request):
limit = 7
publication_list = Publication.objects.all().order_by('published_time').reverse()
paginator = Paginator(publication_list, limit) # Show 7 publications per page
page = request.GET.get('page')
try:
publications = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
publications = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
publications = paginator.page(paginator.num_pages)
return render(request,
'research_spacecoupe/research_accomplishment.html',
{'publications': publications})
research.html
:
分页器:
{% if publications.has_other_pages %}
<ul class="pagination">
{% if publications.has_previous %}
<li><a href="?page={{ publications.previous_page_number }}">«</a></li>
{% else %}
<li class="disabled"><span>«</span></li>
{% endif %}
{% for i in publications.paginator.page_range %}
{% if publications.number == i %}
<li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
{% else %}
<li><a href="?page={{ i }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
{% if publications.has_next %}
<li><a href="?page={{ publications.next_page_number }}">»</a></li>
{% else %}
<li class="disabled"><span>»</span></li>
{% endif %}
</ul>
{% endif %}
索引:
<div class="sidebar-module">
<h4>Archive</h4>
<ol class="list-unstyled">
<li><a href="{% url 'research_spacecoupe:listing' %}">all publications</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2017 %}">2017</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2016 %}">2016</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2015 %}">2015</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2013 %}">2013</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2012 %}">2012</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2011 %}">2011</a></li>
<li><a href="{% url 'research_spacecoupe:publication_year_archive' 2010 %}">2010</a></li>
</ol>
</div>
注:
现在页面可以运行了,我可以点击年份(例如 2017)查看 2017 年发布的出版物,点击 "All publications" 查看所有出版物。但我想用所有出版物的不同 publications.published_time 替换年数。我能做些什么来修复它吗?
views.py
:
from django.db.models.functions import ExtractYear
from django.db.models import Count
# ...
def listing(request):
# ...
years = Publication.objects \
.annotate(year=ExtractYear('published_time')) \
.values_list('year') \
.annotate(count=Count('id')) \
.values_list('year', flat=True) \
.order_by('year')
return render(request,
'research_spacecoupe/research_accomplishment.html',
{'publications': publications,
'years': years})
research_accomplishment.html
:
<div class="sidebar-module">
<h4>Archive</h4>
<ol class="list-unstyled">
<li><a href="{% url 'research_spacecoupe:listing' %}">all publications</a></li>
{% for year in years %}
<li><a href="{% url 'research_spacecoupe:publication_year_archive' year %}">{{ year }}</a></li>
{% endfor %}
</ol>
</div>