Skip to main content
 首页 » 编程设计

python之django博客归档、索引和分页综合应用

2025年02月15日34Free-Thinker

背景:

我正在建立一个关于我的研究小组的博客。在出版物文件页面上,我将展示我导师的所有出版物。这里有一个侧栏显示文件索引,允许用户按年份查看出版物。在页面底部有一个 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 }}">&laquo;</a></li> 
    {% else %} 
        <li class="disabled"><span>&laquo;</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 }}">&raquo;</a></li> 
    {% else %} 
        <li class="disabled"><span>&raquo;</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 年发布的出版物,然后单击“所有出版物”查看所有出版物。但我想用所有出版物的不同 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>