Представления на основе класса Paginator не работают в DJANGO - PullRequest
1 голос
/ 06 июня 2019

Я не уверен, почему не работает пагинатор.Он отображается внизу страницы, но не относится к объектам списка из таблицы «Entity».

Есть ли что-то, что я делаю неправильно в моих html или представлениях?

модели.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>

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Я думаю, должно быть так

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

также я думаю, что будет проще, как это:

class EntityListView(ListView):
  model = Entity
  context_object_name = 'entities'
  paginate_by = 3
2 голосов
/ 06 июня 2019

Проблема заключается в том, что вы передаете queryset как entities своему рендереру, а не page_obj.object_list [Django-doc] , который представляет собой набор элементовдля рендеринга.

Но вы делаете слишком много здесь.На самом деле ListView [Django-doc] определено для удаления всего этого стандартного кода для вас, в противном случае ListView будет совершенно бесполезным:

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

    def get_queryset(self):
        return super().get_queryset()<b>.filter(owner=self.request.user)</b>

Django автоматически разбивает на результат результат get_queryset [Django-doc] и связывает его с context_object_name [Django-doc] (здесь 'entities').

Указав model = Entity [Django-doc] , мы можем легко использовать вышеупомянутую модель сдругая модель.

...