【问题标题】:how to do sorting of a search result item in django如何在 django 中对搜索结果项进行排序
【发布时间】:2021-10-26 21:57:08
【问题描述】:

我有搜索字段,我想为用户提供排序选项,以便用户可以在搜索结果中对价格从低到高到低进行排序,但无法实现 我的看法

class search_item(View):
    def get(self, request):
        search_item = request.GET.get('search')
        if search_item:
            items = Item.objects.filter(Q(name__icontains=search_item)|Q(color__icontains=search_item))
            sort_by = request.GET.get("sort", "l2h") 
            if sort_by == "l2h":
                item = items.order_by("price")
            elif sort_by == "h2l":
                item = items.order_by("-price")
            return render(request, 'search_result.html', {'items':item})

它会进行搜索,但无法对我的代码中的错误进行排序

html

 <li><a class="dropdown-item" href="?sort=l2h">Low To High</a></li>
 <li><a class="dropdown-item" href="?sort=h2l">High To Low</a></li>

我的模特

class Item(models.Model):
    categories = models.ForeignKey(Categories, on_delete=models.CASCADE, related_name='our_items')
    subcategories = models.ForeignKey(Subcategories, on_delete=models.CASCADE, related_name='products')
    name = models.CharField(max_length=200, blank=False)
    swag = models.BooleanField(blank=False, default=False)
    male = models.BooleanField(blank=False, default=False)
    female = models.BooleanField(blank=False, default=False)
    unisex = models.BooleanField(blank=False, default=False)
    first = models.ImageField(upload_to='items', blank=False)
    second = models.ImageField(upload_to='items', blank=False)
    third = models.ImageField(upload_to='items', blank=True)
    color = models.CharField(max_length=30, blank=False, default='Black')
    material = models.CharField(max_length=50, blank=False, default='Plastic' )
    price = models.FloatField(blank=False,)
    description = models.TextField(blank=True)
    
    @staticmethod
    def get_items_by_id(ids):
        return Item.objects.filter(id__in = ids)

    def __str__(self):
        return self.name

我的网址

path('search-result/',search_item.as_view(),name='search')

当我按重新使用的商品价格进行排序时出错 视图 products.views.search_item 没有返回 HttpResponse 对象。它返回 None 。

追溯

Traceback (most recent call last):
  File "C:\Users\mithlesh\Desktop\coolbuy2.0\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\mithlesh\Desktop\coolbuy2.0\lib\site-packages\django\core\handlers\base.py", line 188, in _get_response
    self.check_response(response, callback)
  File "C:\Users\mithlesh\Desktop\coolbuy2.0\lib\site-packages\django\core\handlers\base.py", line 309, in check_response
    raise ValueError(

Exception Type: ValueError at /search-result/
Exception Value: The view products.views.search_item didn't return an HttpResponse object. It returned None instead.

查看哪些排序工作非常好

class Product(View):
    def get(self, request, subcategory_id):
        subcategory = get_object_or_404(Subcategories, pk=subcategory_id)

        sort_by = request.GET.get("sort", "l2h") 
        if sort_by == "l2h":
           products = subcategory.products.order_by("price")
        elif sort_by == "h2l":
           products = subcategory.products.order_by("-price")
        sort_by = request.GET.get("sort", "newest")
        if sort_by == "unisex":
            products = subcategory.products.order_by("-unisex")
        elif sort_by == "newest":
            products = subcategory.products.order_by("-update_at")
        sort_by = request.GET.get("sort", "male")
        if sort_by == "male":
            products = subcategory.products.order_by("-male")
        elif sort_by == "female":
            products = subcategory.products.order_by("-female")

        category_list = Categories.objects.all()
        return render (request, 'products.html',{"subcategory_list" : products, 'category_list': category_list })

【问题讨论】:

  • 您访问的网址到底是什么?
  • 您是说从低到高有效,但从高到低无效?或者它根本不按价格排序? sort_by 在每种情况下都是正确的值吗?
  • 我不太了解 Django,无法理解事物是如何连接的,但如果 search_item 为假,您的 get() 方法会隐式返回 None。你在这里做过调试吗?您确定您的 filter/order_by 代码实际上正在执行吗?至少,如果 search_item 为 false 或 raise Http404(...) 或其他 HTTP 响应对象,您的 get 函数可能应该返回一些内容。
  • 它们略有不同。您的产品/视图/获取代码不是有条件的。您的 search_item/view/get 代码 有条件的 - 它的条件是 search_item 是真实的。请记录 search_item 的值,同时记录items(在过滤器调用之后)和item(在 order_by 调用之后)的值。
  • 你能添加请求的调试信息吗?

标签: django django-views django-class-based-views


【解决方案1】:

以下错误信息是关键:

products.views.search_item 没有返回 HttpResponse 对象。它返回 None 。

它告诉您您的 products.views.search_item 方法返回 None。它怎么能返回None?当search_item 具有错误值并且它完全跳过项目的读取/排序时,它会隐式返回 None。当search 参数不存在(或为空)时,就会发生这种情况。

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2017-05-14
    • 2011-07-13
    相关资源
    最近更新 更多