首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当我点击一个类别时出错

当我点击一个类别时出错
EN

Stack Overflow用户
提问于 2018-06-10 07:01:50
回答 1查看 182关注 0票数 -1

我正在建一个电子商务网站。我有一个有两个类(类别和产品)的模型,我最近在我的list_view中添加了分页,它在我的产品上工作,但当我单击category类时,我得到一个错误。

代码语言:javascript
复制
 from django.shortcuts import render, get_object_or_404 from .models
 import Category, Product from cart.forms import CartAddProductForm
 from django.contrib.auth.decorators import login_required from
 django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.db.models import Q

 def product_list(request, category_slug=None):
     category = None
     categories = Category.objects.all()
     products = Product.objects.filter(available=True)
     query = request.GET.get("q")
     if query:
         products = Product.objects.filter(Q(name__icontains=query) | 
                          Q(description__icontains=query)).distinct()
     paginator = Paginator(products, 10,)
     page = request.GET.get('page', 2)
     try:
         products= paginator.page(page)
     except PageNotAnInteger:
         # If page is not an integer deliver the first page
         products = paginator.page(1)
     except EmptyPage:
         # If page is out of range deliver last page of results
         products = paginator.page(paginator.num_pages)
     if category_slug:
         category = get_object_or_404(Category, slug = category_slug)
         products = products.filter(category=Category)
     return render(request, 'shop/product/list.html', {'category':category, 'categories': categories, 'products': products, 'page': page})

 @login_required def product_detail(request, id, slug):
     product = get_object_or_404(Product,id=id,slug=slug,available=True)
     cart_product_form = CartAddProductForm()
     return render(request,'shop/product/detail.html', {'product': product, 'cart_product_form': cart_product_form})

当我单击产品时,它工作正常,分页也正常工作,但当我单击类别以显示其他产品集时,它显示以下错误:

代码语言:javascript
复制
 Traceback:

 File
 "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site- 
     packages\django-2.0.2-py3.6.egg\django\core\handlers\exception.py"
    in inner
   35.             response = get_response(request)

 File
 "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site- 
    packages\django-2.0.2-py3.6.egg\django\core\handlers\base.py"
   in _get_response
   128.                 response = self.process_exception_by_middleware(e, 
                                                                  request)

 File
 "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site- 
       packages\django-2.0.2-py3.6.egg\django\core\handlers\base.py"
                       in _get_response
   126.                 response = wrapped_callback(request, 
                                          *callback_args, **callback_kwargs)

 File "C:\Users\user\Documents\my webpages\socialapp\shop\views.py" in
 product_list
   30.         products = products.filter(category=Category)

 Exception Type: AttributeError at /shop/softwares-games/ Exception
 **Value: 'Page' object has no attribute 'filter'**
EN

回答 1

Stack Overflow用户

发布于 2018-06-10 08:02:45

查看docs和您的代码:

  • products.filter(category=Category):您正在尝试筛选页面对象,而不是Product的管理者(因为之前您正在执行products= paginator.page(page)操作),因此会出现错误。
  • 您应该在对产品进行分页之前完成对它们的筛选,否则页码永远不会适合
  • 您应该将Django页面对象传递给模板,而不是请求中的page_number,因为这不会解释将产品传递给模板的无效Django。您应该通过Page.object_list

检索匹配的产品

请注意,我没有在本地测试此代码,但应该可以这样做:

代码语言:javascript
复制
def product_list(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True)
    query = request.GET.get("q")
    if query:
        products = products.filter(
            Q(name__icontains=query) | Q(description__icontains=query)).distinct()
    if category_slug:
        # Re-use your category manager for the lookup
        category = get_object_or_404(categories, slug=category_slug)
        products = products.filter(category=Category)
    paginator = Paginator(products, 10)
    # I would start with page 1 and name this variable page_number
    page_number = request.GET.get('page', 1)
    try:
        page = paginator.page(page_number)
    except PageNotAnInteger:
        # If page is not an integer deliver the first page
        page = paginator.page(1)
    except EmptyPage:
        # If page is out of range deliver last page of results
        page = paginator.page(paginator.num_pages)
    return render(request, 'shop/product/list.html', {
        'category': category, 'categories': categories, 
        'products': page.object_list, 'page': page})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50779244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档