Python Django(2.0.4)分页器get_page()工作不正常

Python Django(2.0.4)分页器get_page()工作不正常,python,django,pagination,Python,Django,Pagination,我的问题是使用Paginator get_page()方法。以下是我的查看代码: @login_required def photo_index_default_album(request): album = Album.get_default_album(request.user) photo_list = album.photo_set.all() paginator = Paginator(photo_list, 2) # Show 2 photo per page page = r

我的问题是使用Paginator get_page()方法。以下是我的查看代码:

@login_required
def photo_index_default_album(request):
album = Album.get_default_album(request.user)

photo_list = album.photo_set.all()

paginator = Paginator(photo_list, 2)  # Show 2 photo per page
page = request.GET.get('sayfa')
photos = paginator.get_page(page)

context = {
    'title': album.name,
    'photo': photos,
}

return render(request, 'photo/index.html', context)
paginator.get_页(第页)仅适用于1。页在第二个页面之后,它返回一个页面,该页面包含一个对象列表和一个空查询集

顺便说一下,这可能是一门基础知识。我只是想知道,这两种援助有什么区别:

备选案文1:

photo_list = Photo.objects.all()
photo_list.filter(Q(album=album.id))

备选案文2:

photo_list = Photo.objects.filter(album=album.id)
更新: 好的,我理解两个选项之间的区别。但我的问题还在继续。我根据您的有用答案更新了上面的代码以供查询

问题:此分页仅适用于1。标页码如果页面值的“sayfa”变量不同于1,则表示该变量不起作用。在这种情况下,paginator.get_page()返回一个页面,该页面包含一个包含空查询集的对象列表。检查photo_list.count(),第页,它们在每次调用中都是正确的。模板中的分页器变量对于第一页和最后一页也是真的。但我没有展示这些图片,因为它们是空的。当分页不同于1时,为什么paginator.get_page(page)返回一个查询集为空的对象_列表?顺便说一下,我使用MongoDB作为db后端

奇怪的事情:如果我指定photo_list=photo.objects.all(),我的模板将按预期工作。但我只想显示特定相册的照片。最后更新说明:由于很多图片我没有注意到这个问题,它也有问题

最终更新:(解决方案) 查询结果错误的原因是Djongo包的限制偏移查询错误。我打开了一个问题

我的模型:

class Photo(models.Model):
image = models.ImageField()
album = models.ManyToManyField(Album)

class Album(models.Model):
name = models.CharField(max_length=150)
user = models.ForeignKey('accounts.MyUser', verbose_name='Album Owner', on_delete=models.CASCADE)
我的模板:很抱歉给您带来不便,它有点长

{% extends 'base.html' %}

{% block title %}
{{ block.super }} - {{ title }}
{% endblock %}

{% block body %}
<div class="container">
    {% for pht in photo %}
        <div class="row justify-content-center" style="margin-bottom: 30px">
            <div class="col-md-6">
                <div class="card">
                    {% if pht.image %}
                        <img class="card-img-top img-fluid" src="{{ pht.image.url }}" alt="Card image cap">
                    {% endif %}
                    <div class="card-body">
                        <h5 class="card-title">{{ title }}
                            <small style="color: #4e555b"> {{ pht.upload_date|timesince }} before</small>
                        </h5>
                        {% if request.user.is_authenticated %}
                            <a href="{{ pht.get_delete_url }}" class="btn btn-danger">Delete</a>
                        {% endif %}
                    </div>
                </div>
            </div>
        </div>
    {% endfor %}

    <div class="row justify-content-center" style="margin-bottom: 30px">
        <div class="col-md-6">
            <div class="pagination">
        <span class="step-links">
            {% if photo.has_previous %}
                <a href="?sayfa=1{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">&laquo; first</a>
                <a href="?sayfa={{ photo.previous_page_number }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">previous</a>
            {% endif %}

            <span class="current">
                Page {{ photo.number }} of {{ photo.paginator.num_pages }}.
            </span>

            {% if photo.has_next %}
                <a href="?sayfa={{ photo.next_page_number }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">next</a>
                <a href="?sayfa={{ photo.paginator.num_pages }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">last &raquo;</a>
            {% endif %}
        </span>
            </div>
        </div>
    </div>

</div>

{% endblock %}
{%extends'base.html%}
{%block title%}
{{block.super}}-{{title}
{%endblock%}
{%block body%}
{照片%中的pht为%1}
{%if pht.image%}
{%endif%}
{{title}}
{{pht.upload{u date}timesince}之前
{%if request.user.u经过身份验证%}
{%endif%}
{%endfor%}
{%if photo.has_previous%}
{%endif%}
第{{photo.paginator.num_pages}页中的第{{photo.number}页。
{%if photo.has_next%}
{%endif%}
{%endblock%}

除非结果存储回
照片列表
,否则

photo_list = Photo.objects.all()
photo_list.filter(Q(album=album.id))
没有效果。这是您提供的两段代码之间的唯一区别(为了可读性,我建议使用第二段代码,基于
filter

这里:

photo_list = Photo.objects.all()
photo_list.filter(Q(album=album.id))
第二条语句在功能上是no op-调用
photo\u list.filter(…)
会创建一个新的
QuerySet
,它会立即被丢弃,因为您没有将它绑定到任何东西

因此,使用此代码,传递给
Paginator
QuerySet
实际上是
Photo.objects.all()

在第二种情况下,您需要将
photo\u list
重新绑定到
photo.objects.filter(album=album.id)
(这是写入
photo.objects.filter(Q(album=album.id))的最短方法)
,因此,您只会得到与当前相册匹配的行,而不是整个表的内容。您没有发布整个模型,但您也可以使用相关描述符(默认情况下,这将是
album.photo\u set.all()
,参见精细手册)得到相同的结果。因此,您的查询集的行数确实会少得多


您也没有发布模板代码(嗯,相关部分…),因此我们无法确定是否存在其他问题,但根据您当前相册的照片数,这可能只是预期的结果。提示:您可以使用
photo\u list.count()检查给定相册的照片总数

谢谢你的承诺,我更喜欢相册。照片集。全部()选项,这更像是脚本而不是查询风格。更新了问题,如果你对我的问题有任何想法,我将非常高兴。你能检查
sayfa
的值吗?根据
Paginator
的源代码,如果ded编号无效(不是整数或可转换为整数的字符串,或…)。我控制了
sayfa
page
值。是的,如果值无效,它绝对会将值更改为1。但问题仍然存在。我将把db后端更改为sqlite,对集成Django应用程序和MondoDb的包djongo非常怀疑。谢谢你,Guybrush,因为我预期的问题是关于djongo包的年龄,用解决方案部分更新了我的问题。谢谢布鲁诺,你显然打开了我的思路:)我的问题还在继续,你能检查我的更新吗?