【问题标题】:Django how to pass user object in class based view pagenation?Django如何在基于类的视图分页中传递用户对象?
【发布时间】:2021-07-15 08:14:31
【问题描述】:

默认基于类的视图分页返回所有对象。我的每个用户都有一个我的帐户页面,我需要在其中显示页码。默认情况下,所有用户的分页都是相同的。让你稍微解释一下。如果用户 A 有 10 个项目,而我每页列出 2 个项目,那么用户 A 将在他的帐户中看到总共 5 页,这很好,但用户 B 没有任何项目,他目前只看到像 page1、page2、page3 这样的分页数...在他的帐户中,因为当前分页从数据库中返回所有项目。这是我的代码:

views.py

class BlogMyAccount(ListView):
      paginate_by = 10
      model = Blog
      template_name = 'blog/my-account.html'
      ordering = ['-id']

#html

{% for blog in object_list %}   
{% if user.id == blog.author.id %}  
 ....my code
{% endif %}
{% endfor %}   

<!---pagination code---->
  <ul class="pagination justify-content-center mb-4">
                        {% if page_obj.has_previous %}
                        <li class="page-item"><a class="page-link" href="?page=1">First Page</a></li>
                        <li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}">← Back</a></li>
                        {% endif %}

                        {% if page_obj.has_next %}
                        <li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}">Next Page →</a></li>
                        
                        {% endif %}

                        {% for i in paginator.page_range %}
                        {% if page_obj.number == i %}
                        <li class="page-item"><a class="page-link" href="#!">{{ i }}</a></li>
                          
                        {% elif i > page_obj.number|add:'-3' and i < page_obj.number|add:'3' %}
                        <li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
                        {%endif%}
                        {% endfor %}

                        <li class="page-item"><a class="page-link" href="?page={{ page_obj.paginator.num_pages }}">Last Page</a></li>
                    </ul> 

在基于函数的视图中,我在分页中传递这样的用户对象:

 notifications = Notifications.objects.all().filter(user=user).order_by('-date') 
 paginator = Paginator(notifications, 20) # Show 25 contacts per page. 

我尝试通过在我的分类视图中使用上下文来应用相同的方法,但没有奏效。在基于类的视图中,所有用户的分页都是相同的。

【问题讨论】:

    标签: django django-class-based-views


    【解决方案1】:

    您需要像在 FBV 中那样过滤查询集。覆盖 get_queryset() 以仅返回与您的请求用户关联的对象。

    class BlogMyAccount(ListView):
        paginate_by = 10
        model = Blog
        template_name = 'blog/my-account.html'
        ordering = ['-id']
        
        def get_queryset(self):
            queryset = Blog.objects.filter(author=self.request.user)
            return queryset
    
          
    

    另外你不需要在 Notifications.objects 上调用 .all(),它已经是一个查询集,Notifications.objects.filter() 就可以了。

    如果可能,将排序移至 models.py 文件,如下所示:

    class Meta:
        ordering = ['-id']
    

    【讨论】:

      【解决方案2】:

      您可以覆盖get_querset 方法,并通过使用super() 调用,让Django 为我们执行.order_by 子句:

      from django.contrib.auth.mixins import LoginRequiredMixin
      
      class BlogMyAccount(LoginRequiredMixin, ListView):
            paginate_by = 10
            model = Blog
            template_name = 'blog/my-account.html'
            ordering = ['-id']
      
          def get_queryset(self, *args, **kwargs):
              #                 &downarrow; will take care of the ordering
              return super().get_querset(*args, **kwargs).filter(
                  author=self.request.user
              )

      注意:您可以将视图限制为基于类的视图,以向经过身份验证的用户提供 LoginRequiredMixin mixin [Django-doc].

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-08
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多