Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Paginator类的视图在DJANGO中不起作用_Django_Python 3.x_Django Views_Django Class Based Views_Paginator - Fatal编程技术网

基于Paginator类的视图在DJANGO中不起作用

基于Paginator类的视图在DJANGO中不起作用,django,python-3.x,django-views,django-class-based-views,paginator,Django,Python 3.x,Django Views,Django Class Based Views,Paginator,我不知道为什么分页器不工作。它确实显示在页面底部,但不适用于实体表中的列表对象 我的html或视图中是否有错误 models.py class Entity(models.Model): entity_name = models.CharField(max_length=250, blank=False) owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='users') slug

我不知道为什么分页器不工作。它确实显示在页面底部,但不适用于实体表中的列表对象

我的html或视图中是否有错误

models.py

class Entity(models.Model):
    entity_name = models.CharField(max_length=250, blank=False)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='users')
    slug = models.SlugField(max_length=250, unique=True, null=True)
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = "Entities"

    def __str__(self):
        return self.entity_name

    def get_absolute_url(self):
        return reverse('snippets:password', kwargs={'pk': self.pk})
views.py

class EntityListView(LoginRequiredMixin, ListView):

    template_name = 'snippets/list.html'

    def get(self, request):

        queryset = Entity.objects.filter(owner=request.user)

        paging = queryset

        paginator = Paginator(paging, 3) 

        page = request.GET.get('page')

        page_obj = paginator.get_page(page)

        return render(request, self.template_name, context={
                                                'entities':queryset,
                                                'page_obj':page_obj
                                                })

html.py

{% for entity in entities %}

        <a href='{% url "snippets:password" entity.pk %}'>{{ entity.entity_name }}</br></br></br></a>

      {% endfor %}


      <div class="pagination">
          <span class="step-links">
              {% if page_obj.has_previous %}
                  <a href="?page=1">&laquo; first</a>
                  <a href="?page={{ page_obj.previous_page_number }}">previous</a>
              {% endif %}

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

              {% if page_obj.has_next %}
                  <a href="?page={{ page_obj.next_page_number }}">next</a>
                  <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
              {% endif %}
          </span>
      </div>


任何帮助都将不胜感激。

问题在于您将查询集作为实体传递给渲染器,而不是作为要渲染的元素集合传递给渲染器

但是你自己在这里做的太多了。事实上,定义a是为了删除所有样板代码,否则ListView将毫无用处:

class EntityListView(LoginRequiredMixin, ListView):
    model = Entity
    template_name = 'snippets/list.html'
    context_object_name = 'entities'
    paginate_by = 3

    def get_queryset(self):
        return super().get_queryset().filter(owner=self.request.user)
Django将自动为的结果分页,并将其与此处的“实体”关联


通过指定,我们可以轻松地将上述模型与其他模型一起重用。

问题在于,将queryset作为实体传递给渲染器,而不是作为要渲染的元素集合传递给渲染器

但是你自己在这里做的太多了。事实上,定义a是为了删除所有样板代码,否则ListView将毫无用处:

class EntityListView(LoginRequiredMixin, ListView):
    model = Entity
    template_name = 'snippets/list.html'
    context_object_name = 'entities'
    paginate_by = 3

    def get_queryset(self):
        return super().get_queryset().filter(owner=self.request.user)
Django将自动为的结果分页,并将其与此处的“实体”关联


通过指定,我们可以轻松地将上述模型与其他模型重用。

我认为应该是这样的

返回renderrequest,self.template_name,context={'entities':page_obj,'page_obj':page_obj}

而且我觉得会更简单,像这样:

class EntityListView(ListView):
  model = Entity
  context_object_name = 'entities'
  paginate_by = 3

我想应该是这样

返回renderrequest,self.template_name,context={'entities':page_obj,'page_obj':page_obj}

而且我觉得会更简单,像这样:

class EntityListView(ListView):
  model = Entity
  context_object_name = 'entities'
  paginate_by = 3

错误为TypeError:get_queryset缺少1个必需的位置参数:“请求”。使用您上面提供的代码。@CurtisBanks:但是您自己调用了get_queryset?为什么?Django的ListView实现了.get。。本身:这实际上是ListView的全部观点。您不应该做大部分的how,而应该做更多的what。我最初使用queryset将queryset分配给变量,而不是作为方法。@CurtisBanks:但ListView的观点是,正如前面所说,您不需要编写这个queryset=…,paginator=。。。并呈现…,你自己。Django已经为您实现了这一点,您有时唯一需要做的就是覆盖get_queryset、get_context_data等。在这里,您只需要覆盖get_queryset。没有别的了。看一看。得到。。实施Django实现了对模板进行分页和呈现的逻辑。错误为TypeError:get_queryset缺少1个必需的位置参数:“request”。使用您上面提供的代码。@CurtisBanks:但是您自己调用了get_queryset?为什么?Django的ListView实现了.get。。本身:这实际上是ListView的全部观点。您不应该做大部分的how,而应该做更多的what。我最初使用queryset将queryset分配给变量,而不是作为方法。@CurtisBanks:但ListView的观点是,正如前面所说,您不需要编写这个queryset=…,paginator=。。。并呈现…,你自己。Django已经为您实现了这一点,您有时唯一需要做的就是覆盖get_queryset、get_context_data等。在这里,您只需要覆盖get_queryset。没有别的了。看一看。得到。。实施Django实现了逻辑来分页,并呈现模板。实际上,实体应该是page_obj.object_list。它起作用了。谢谢。我们的目标也是为每个用户返回实体表中的对象列表,这样不同的用户就无法访问相同的项目列表。我没有创建的那些实体实际上应该是page_obj.object_list。它起作用了。谢谢。我们的目标也是为每个用户返回实体表中的对象列表,这样不同的用户就不能访问我没有创建的相同项目列表