Python 如何根据访问者在表的列值中设置筛选器

Python 如何根据访问者在表的列值中设置筛选器,python,django,Python,Django,如果表名为“产品”,列名为“主题”。获取产品的所有值后,如何根据访问者的请求设置过滤器 我用的是Django。简短的答案 安装并阅读它的文档 长话短说 传递信息 您需要一种方法将访问者浏览器选择的过滤器传递给Django。为此,您可以使用或在模板中构建 收集信息 与Django中的所有内容一样,我们在视图中收集请求信息和模型,并返回响应。我偏爱基于类的视图,所以我将使用这些视图。这里有很多处理表单输入的“表单视图”示例,因此我们将坚持使用查询字符串的方式 每个“”都以View.request的形

如果表名为“产品”,列名为“主题”。获取产品的所有值后,如何根据访问者的请求设置过滤器

我用的是Django。

简短的答案 安装并阅读它的文档

长话短说 传递信息 您需要一种方法将访问者浏览器选择的过滤器传递给Django。为此,您可以使用或在模板中构建

收集信息 与Django中的所有内容一样,我们在视图中收集请求信息和模型,并返回响应。我偏爱基于类的视图,所以我将使用这些视图。这里有很多处理表单输入的“表单视图”示例,因此我们将坚持使用查询字符串的方式

每个“”都以
View.request
的形式获取分配给它的请求,以便我们可以在视图的任何方法中以
self.request
的形式访问它。因为我们要展示同一模型的多个对象,所以这是一个很好的开始

from django.views.generic import ListView

class FilteredProductsView(ListView):
    model = Products
    context_object_name = 'products'
    template_name = 'view/products.html'
    filter_map = { 'name': 'subject__iexact', 'price': 'sales_price__lte' }

    def get_queryset(self):
        filter_kwargs = {}
        subject_filter = self.request.GET.get('name', None)
        if subject_filter:
             filter_kwargs[self.filter_map['name']] = subject_filter
        price_filter = self.request.GET.get('price', None)
        if price_filter:
             filter_kwargs[self.filter_map['price']] = float(price_filter)
        return self.model.objects.filter(**filter_kwargs) \
            if filter_kwargs else self.model.objects.all()
输出信息 在我们的filtered products视图中,我们定义了模板名称以及名为
context\u object\u name
。这是我们可以在模板中用于渲染模型实例的名称
ListView
始终将模板的queryset定义为
object\u list
,但如果名称更有意义,则会使模板更具可读性

现在我们可以在模板
视图/products.html
中执行以下操作:

<table class="table table-hover">
    <tbody>
        {% for product in products %}
            <tr>
                <td>{{ product.subject }}</td>
                <td class="bg-success">{{ product.sales_price }}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>

{products%中产品的%s}
{{product.subject}}
{{product.sales_price}
{%endfor%}
进一步阅读
简短的回答 安装并阅读它的文档

长话短说 传递信息 您需要一种方法将访问者浏览器选择的过滤器传递给Django。为此,您可以使用或在模板中构建

收集信息 与Django中的所有内容一样,我们在视图中收集请求信息和模型,并返回响应。我偏爱基于类的视图,所以我将使用这些视图。这里有很多处理表单输入的“表单视图”示例,因此我们将坚持使用查询字符串的方式

每个“”都以
View.request
的形式获取分配给它的请求,以便我们可以在视图的任何方法中以
self.request
的形式访问它。因为我们要展示同一模型的多个对象,所以这是一个很好的开始

from django.views.generic import ListView

class FilteredProductsView(ListView):
    model = Products
    context_object_name = 'products'
    template_name = 'view/products.html'
    filter_map = { 'name': 'subject__iexact', 'price': 'sales_price__lte' }

    def get_queryset(self):
        filter_kwargs = {}
        subject_filter = self.request.GET.get('name', None)
        if subject_filter:
             filter_kwargs[self.filter_map['name']] = subject_filter
        price_filter = self.request.GET.get('price', None)
        if price_filter:
             filter_kwargs[self.filter_map['price']] = float(price_filter)
        return self.model.objects.filter(**filter_kwargs) \
            if filter_kwargs else self.model.objects.all()
输出信息 在我们的filtered products视图中,我们定义了模板名称以及名为
context\u object\u name
。这是我们可以在模板中用于渲染模型实例的名称
ListView
始终将模板的queryset定义为
object\u list
,但如果名称更有意义,则会使模板更具可读性

现在我们可以在模板
视图/products.html
中执行以下操作:

<table class="table table-hover">
    <tbody>
        {% for product in products %}
            <tr>
                <td>{{ product.subject }}</td>
                <td class="bg-success">{{ product.sales_price }}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>

{products%中产品的%s}
{{product.subject}}
{{product.sales_price}
{%endfor%}
进一步阅读

可能是这样的:
Product.objects.filter(subjects='user input')
。请参阅Django文档。。请注意,查询集只能解决问题的一部分。用户需要从webbrowser请求到输出的指导,并且缺少概述。我是否需要为每个可能的值对设置筛选器…因为用户可以请求单个或多个值。可能是这样的:
Product.objects.filter(subjects='user input')
。请参阅Django文档。。请注意,查询集只能解决问题的一部分。用户需要从webbrowser请求到输出的指导,并且缺少概述。我是否需要为每个可能的值对设置筛选器…因为用户可以请求单个或多个值。。