Django使用多个查询进行过滤

时间:2020-09-11 10:52:36

标签: python html django filter

我的主页上有一个搜索栏,当您搜索某些内容时,它会将您重定向到包含结果(标题和文档类型)的页面。在页面的左侧,我想按文档类型实现过滤器。

搜索后,我的网址如下:http://127.0.0.1:8000/search/?document_type=Tehnical+report

应用过滤器后:http://127.0.0.1:8000/search/?q=something&document_type=Tehnical+report

我不知道如何实现过滤器以仅在搜索页面上由查询(q)过滤的对象列表中进行搜索。另外,我不确定在应用过滤器后,网址应该是http://127.0.0.1:8000/search/?document_type=Tehnical+report还是DOCUMENT_TYPES = [ ('Tehnical report','Tehnical report'), ('Bachelor thesis','Bachelor thesis'), ... ] class Form_Data(models.Model): title = models.CharField(unique=True, max_length=100, blank=False) author = models.CharField(max_length=100) document_type = models.CharField(choices=DOCUMENT_TYPES, max_length=255, blank=False, default=None)

models.py

def search_list(request):
    object_list = Form_Data.objects.none()
    document_types = DOCUMENT_TYPES

    query = request.GET.get('q')
    query_list = re.split("\s|(?<!\d)[,.](?!\d)", query)
    document_type_query = request.GET.get('document_type')

    for item in query_list:
        object_list |= Form_Data.objects.filter( Q(title__icontains=item) | Q(author__icontains=item))

    return render(request, "Home_Page/search_results.html")

views.py

<div class="Search">
    <form action="{% url 'home_page:search_results' %}" method="get">
        <input id="Search_Bar" type="text" name="q">
        <button id="Button_Search" type="submit"></button>
    </form>
</div>

home_page.html

{% for form_data in object_list %}
    <h5>{{ form_data.title }}</h5>
    <h5>{{ form_data.document_type }}</h5>
{% endfor %}

<form method="GET" action=".">
    <select class="form-control" name="document_type">
        {% for tag, label in document_types %}
            <option value="{{ tag }}">{{ tag }}</option>
        {% endfor %}
    </select>
</form>

search_results.html

{{1}}

2 个答案:

答案 0 :(得分:1)

这将是模型过滤:

query = request.GET.get('q')
document_type_query = request.GET.get('document_type')

object_list = FormData.objects.none()

for item in query.split():
    item_qs = FormData.objects.filter(Q(title__icontains=item) | Q(author__icontains=item))
    if document_type_query:
         item_qs = item_qs.filter(document_type=document_type_query)
    object_list |= item_qs

return render(request, "Home_Page/search_results.html", {"object_list": object_list})

这是URL:

http://127.0.0.1:8000/search/?q=something%20with%20spaces&document_type=Tehnical+report

答案 1 :(得分:1)

我认为您的操作方式有误...我的意思是我不明白您为什么循环query进行过滤。据我所知,它正在循环查询的每个字母。

我正在这样做,我会这样做(使用我自己的示例):

<form action='{% url 'products:search' %}' method='get'>
    <input type='text' name='q' id='search' value='' >
    <select name='category' id='category'>
        <option value='' selected ></option>
        <option value='packet'>Packet</option>
        <option value='food'>Food</option>
        <option value='vegetable'>Vegetable</option>
    </select>
    <input type='button' value='submit' >
</form>

views.py:

def search(request):
    products = None
    query = request.GET.get('q')
    category = request.GET.get('category')
    
    if query:
        products = Product.objects.filter(
            Q(name__icontains=query)|
            Q(brand__icontains=query)
        )
    if category:
        # since it is a choice field in the model
        products |= Products.objects.filter(category=category) 

    context = {
        'products': products,
    }
    return render(request, 'products/search_products.html', context)

在这种情况下,如果我按下“提交”按钮,我将得到一个类似以下的网址:

http://localhost:8000/products/search/?q=something&category=food

利用这些数据,我可以按名称或我想要的任何其他字段过滤产品。

我看不到有人会输入其查询并且搜索结果将具有在输入字段中输入任何字母的所有产品的情况。