如何在Django中添加分页?

g0czyy6m  于 2022-12-01  发布在  Go
关注(0)|答案(2)|浏览(151)

我想对我的数据进行分页,我试着看了很多视频,读了很多文章,但仍然不能解决我的问题。这是我的观点。

def car(request):
    all_products = None 
    all_category = category.get_all_category()
    categoryid = request.GET.get('category')
    if categoryid:
        all_products = Product.get_all_products_by_id(categoryid)
    else:
        all_products = Product.get_all_products()
        
    data = {}
    data['products'] = all_products  # all products
    
    data['category'] = all_category # all category
    all_products = Product.get_all_products()
    data['product'] = all_products
    ]
    return render(request, 'car.html', data)

正如你所看到的,我在上面的代码中做了一些修改,但没有什么区别

def car(request):
    all_products = None 
    all_category = category.get_all_category()
    categoryid = request.GET.get('category')
    if categoryid:
        all_products = Product.get_all_products_by_id(categoryid)
    else:
        all_products = Product.get_all_products()
         #pagination
    paginator = Paginator(all_products,2) **Changes**
    page_number=request.GET.get('page') **Changes**
    finaldata=paginator.get_page(page_number) **Changes**
    
    data = {'all_products':finaldata,}  **Changes**
    data['products'] = all_products #all products
   
    data['category'] = all_category #all category
    all_products = Product.get_all_products()
    data['product'] = all_products
  return render(request, 'car.html', data)

我想显示4产品每页我试图应用数据限制查询工作,但这不是一个真正的方法来显示数据。我读了很多文章,并观看YouTube视频。但找不到任何解决方案。其中视频和文章,我看了那里分页方法是完全不同的,他们使用对象分页。所有的方法来获得所有的数据,我用。第二件事是,他们只是用简单的数据来分页,但在我的情况下,它是如此复杂。我尝试了很多,请指导。我陷入了解决一个问题5天了。我确信我不是一个好的程序员。我尝试了很多,但我不能成功。

2admgd59

2admgd591#

根据分页文档,它类似于:(始终浏览框架文档,它是最佳学习来源)
views.py

from django.core.paginator import Paginator
from django.shortcuts import render

def car(request, category_id=None):
    products = Products.objects.all() 

    if category_id:
        products = Product.objects.filter(category__id=category_id)

    paginator = Paginator(products, 3)

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    context = {
        'page_obj': page_obj
    }

    return render(request, 'car.html', context)

tempate.html(您可以在其中访问上一页和下一页以及总页数)

{% for car in page_obj %}
    {{ car.category }}<br>
    ...
{% 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>

urls.py (you希望传递category_id,如果不传递,则为none)

path('cars/category/<int:category_id>/', views.car, name='car'),
kknvjkwl

kknvjkwl2#

**我的问题几乎解决了。有一个问题。我不能在分页中获得下一个、上一个和最后一个选项,但很快我就会解决它。**这是我的views.py文件编码

def car(request):
    all_products = None 
    all_category = category.get_all_category()
    categoryid = request.GET.get('category')
    if categoryid:
        all_products = Product.get_all_products_by_id(categoryid)
    else:
        all_products = Product.get_all_products()
         #pagination
    paginator = Paginator(all_products,3)
    page_number=request.GET.get('page')
    finaldata=paginator.get_page(page_number)

    totalpage=finaldata.paginator.num_pages

    
    data = {'all_products':finaldata,
    'lastpage':totalpage,
    'totalPageList':[n+1 for n in range(totalpage)]}

    data['products'] = finaldata #all products

   
    data['category'] = all_category #all category
    all_products = Product.get_all_products()
    data['product'] = all_products
    
    return render(request, 'car.html', data)

这是我的html编码my html file screenshot由于此错误,我正在共享html屏幕截图您的帖子似乎包含格式不正确的代码。请使用代码工具栏按钮或Ctrl+K键盘快捷方式将所有代码缩进4个空格。有关编辑帮助的详细信息,请单击[?]工具栏图标。看起来您的帖子大部分是代码;请添加更多详细信息。
我不熟悉堆栈溢出,所以我不知道该怎么做,所以我分享了屏幕截图
当我找到第一个、上一个和最后一个选项的任何解决方案时,我很快就会在这里分享

相关问题