【问题标题】:django blog archive, index and pagination comprehensive applicationdjango博客归档、索引和分页综合应用
【发布时间】:2017-08-20 06:10:10
【问题描述】:

背景:

我正在建立一个关于我的研究小组的博客。在出版物存档页面上,我将显示我导师的所有出版物。这里有一个侧栏显示归档索引,允许用户按年份查看出版物。在页面底部有一个 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 替换年数。我能做些什么来解决它?

【问题讨论】:

    标签: python django pagination blogs archive


    【解决方案1】:

    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>
    

    【讨论】:

    • 谢谢。但是出现了一个错误:“Publication”对象没有“values_list”属性。
    • 我更新了解决这个问题的答案(values_list 应该是第一,earliest/latest - 第二)。
    • 我修改了代码:min_year = Publication.objects.values_list('published_time', flat=True).earliest('published_time').year max_year = Publication.objects.values_list('published_time', flat=True).latest('published_time').year
    • 但是有一个新的问题,因为这里的max_year和min_year只定义了要返回的年份范围。但是2014年没有发布,导致404页面。
    • 哦,好的,我更新了代码,你可以直接从数据库中读取所有可用的年份。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多