如何在Django的搜索结果中实现分页?

时间:2018-08-27 14:05:22

标签: python django pagination

我找到了一个具有如下代码的资源:

from django.contrib.auth.models import User
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def index(request):
    user_list = User.objects.all()
    page = request.GET.get('page', 1)

    paginator = Paginator(user_list, 10)
    try:
        users = paginator.page(page)
    except PageNotAnInteger:
        users = paginator.page(1)
    except EmptyPage:
        users = paginator.page(paginator.num_pages)

    return render(request, 'core/user_list.html', { 'users': users })

我有这样的代码:

def product_list(request, category_slug=None):

    category = None
    categories = Category.objects.all().order_by("-rating")
    #paginator = Paginator(categories, 10)
    products = Product.objects.all().order_by("-number")
    users = User.objects.exclude(id=request.user.id)
    query = request.GET.get('q')
    if query=='':
        return HttpResponseRedirect('/')
    if query:
        categories = Category.objects.filter(Q(slug__icontains=query)| Q(url__icontains=query)).order_by("-rating") 
        products = Product.objects.filter(Q(slug__icontains=query) | Q(name__icontains=query) | Q(description__icontains=query)).order_by("number")
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = Product.objects.filter(category=category)

    categories_counter = products.annotate(Count('id'))
    categories_count = len(categories_counter)
    #contacts = paginator.get_page(query)

    context = {
        'category': category,
        'categories': categories,
        'products': products,
        'categories_count':categories_count,
        'query':query,
        'users':users,
        #'contacts':contacts,
    }
    return render(request, 'shop/product/list.html', context)

我已经从两个模型(类别和产品)中检索了对象。如何在此视图中实现分页代码?这不是正常的分页,而是搜索结果中的分页。

1 个答案:

答案 0 :(得分:2)

user_list = User.objects.all() # this is the full queryset, contains all objects
page = request.GET.get('page', 1) # this is the page number of page whose data you want to retrieve, you need to pass page value as query params

paginator = Paginator(user_list, 10) # this will paginate the full queryset in pages of 10 objects
try:
    users = paginator.page(page) # this will return data of that particular page
except PageNotAnInteger:
    users = paginator.page(1) # if the passed page is not Integer then first page is returned, you can customize this
except EmptyPage:
    users = paginator.page(paginator.num_pages) # if that page contains no element, then last page is returned, you can customize this also

您可以应用相同的逻辑来检索category_page和其他数据中的类别。