Django美多商城商品搜索页踩坑记录

目录

内容介绍:

1. 错误代码展示:                                          

2. 错误分析:

3. 代码重构:


内容介绍:

    在B站黑马程序员“P218 搜索实现”中的代码有些许错误,本博客重构了错误的API

1. 错误代码展示:                                           

# 导入: 
from haystack.views import SearchView
from django.http import JsonResponse
 
class MySearchView(SearchView):
    '''重写SearchView类'''
    def create_response(self):
        # 获取搜索结果
        context = self.get_context()
        data_list = []
        for sku in context['page'].object_list:
            data_list.append({
                'id':sku.object.id,
                'name':sku.object.name,
                'price':sku.object.price,
                'default_image_url':sku.object.default_image.url,
                'searchkey':context.get('query'),
                'page_size':context['page'].paginator.num_pages,
                'count':context['page'].paginator.count
            })
        # 拼接参数, 返回
        return JsonResponse(data_list, safe=False)

2. 错误分析:

  1. 可能是自己的Django版本号选用的是 django4版本, 而这个项目讲解使用的django2
  2. 可能是自己安装的Django版本不一致,默认安装的 drf-haystack库版本不一致,导致重写SearchView的类方法 create_response行不通

3. 代码重构:

        经过去官网查询 haystack这个库的API我使用重写了一些这个函数,根据 Search类中的get_context() 方法,重写了一个相似功能的Django的类视图。

from haystack.query import SearchQuerySet

class SearchView(View):

    def get(self, request):
        # page是第几页, page_size一页几个数据, q是查询字符串
        page = request.GET.get('page')
        page_size = request.GET.get('page_size')
        q = request.GET.get('q')
        if not all([page, page_size, q]):
            return JsonResponse({'code': 0, "errmsg": "参数不全"})
        # 执行搜索
        sku = SearchQuerySet().filter(content=q)
        # 分页
        paginator = Paginator(sku, page_size)
        # 获取每页商品数据
        try:
            page_skus = paginator.page(page)
        except EmptyPage:
            # 如果page_num不正确,默认给用户400
            return JsonResponse({'code': 400,
                                 'errmsg': 'page数据出错'})
        # 获取列表页总页数
        total_page = paginator.num_pages

        # 将搜索结果转换为字典列表
        sku_list = []
        for result in page_skus:  # 限制结果数量(可选)
            sku_list.append({
                'id': result.object.id,
                'name': result.object.name,
                'price': result.object.price,
                'default_image_url': result.object.default_image.url,
                'searchkey': q,
                'page_size': page_size,
                'count': total_page
            }
            )
        return JsonResponse(sku_list, safe=False)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rosen。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值