Django 2.0:通过搜索动态获取查询

时间:2018-08-20 11:21:49

标签: django python-3.x django-views django-queryset

我是Django框架的新手,作为一个练习项目,我试图使用Django建立一个电子商务网站。我的搜索页面有一个基于类的视图。我编写了该视图以获取特定查询的查询:

views.py

class SearchProductView(ListView):  
    template_name = "template.html"
    queryset = Product.objects.filter(title__icontains='book')
    print(queryset)

我想知道如何编写一个函数来动态获取搜索查询。例如:如果我搜索book,则我的queryset应包含有关book的所有信息,如果我搜索car,则应获取有关{{1}的所有信息}。

template.html

car

urls.py

{% extends "base.html" %}
{% block content %} 
<div class='row'>
    {% for object in object_list %}
    <div class='col'>
        {{ forloop.counter }}
        {% include 'products/snippets/card.html' with instance=object %}
    </div>
    {% endfor %}
</div>  
{% endblock %}

2 个答案:

答案 0 :(得分:1)

您需要定义get_queryset方法,而不是类级别的queryset属性。这可以使用您的querystring参数动态过滤查询集。

您没有显示搜索表单或没有说出您的参数是什么,但是假设它提交了名为q的GET参数,您可以这样做:

def get_queryset(self):
    return Product.objects.filter(title__icontains=self.request.GET['q'])

答案 1 :(得分:1)

尽管上面的答案会奏效,但我相信以下方法会更好:

models.py

class Category(models.Model):
    title = models.CharField(...)


class Product(models.Model):
    ...
    category = models.ForeignKey(Category)

views.py

from django.db.models import Q

def get_queryset(self):
    querystr = self.request.GET['q']
    Product.objects.filter(
        Q(title__icontains=querystr) | Q(category__title__icontains=querystr)
    )