如何在Django中实现搜索功能?

2024-06-05 00:58:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在数据库里有很多书。搜索数据库不会返回任何内容(空的queryset)。

在菜单中:

<form name="myform" method="POST" action="{% url 'search' %}">  
    {% csrf_token %}
    <input type="text" name="search" placeholder="Search" />
</form> 

视图.py

def search(request):        
    if request.method == 'POST':      
        book_name =  request.POST.getlist('search')      
        try:
            status = Add_prod.objects.filter(bookname__icontains=book_name)
            #Add_prod class contains a column called 'bookname'
        except Add_prod.DoesNotExist:
            status = None
        return render(request,"search.html",{"books":status})
    else:
        return render(request,"search.html",{})

我的模板文件

{% if books %}
    <a href="{% url 'buy_book' pk=books.pk %}">
    <!--Upon successful search book image with hyperlink appears -->
    <img src="{{books.image.url}}" alt="No Image"></a>
    <p>{{books.bookname}}</p>
    <p>Rs.{{books.price}}</p>   
{% endif %}

Tags: nameformadd数据库urlsearchifrequest
2条回答

我想在这里补充几点。。

1)我觉得搜索结果应该是方法得不到帖子。您可以参考this链接来查看何时使用POST以及何时使用GET

<form name="myform" method="GET" action="{% url 'search' %}"> 
// see if you need csrf_token here when this is GET request. Your homework

2)视图.py

def search(request):        
    if request.method == 'GET': # this will be GET now      
        book_name =  request.GET.get('search') # do some research what it does       
        try:
            status = Add_prod.objects.filter(bookname__icontains=book_name) # filter returns a list so you might consider skip except part
        return render(request,"search.html",{"books":status})
    else:
        return render(request,"search.html",{})

3)django模板现在应该是

{% if books %}
{% for each_book in books %} // books is list here so pick each element using for loop 
    <a href="{% url 'buy_book' pk=each_book.pk %}">
    <!--Upon successful search book image with hyperlink appears -->
    <img src="{{each_book.image.url}}" alt="No Image"></a>
    <p>{{each_book.bookname}}</p>
    <p>Rs.{{each_book.price}}</p>   
{% endfor %}
{% endif %}

这应该很有效。

还要确保在数据库中有一些数据,以便在搜索时获取一些结果!

似乎需要使用for,因为图书是一个查询集

在模板中,尝试:

{% if books %}
{% for book in books %}
    <a href="{% url 'buy_book' pk=book.pk %}">
    <!--Upon successful search book image with hyperlink appears -->
    <img src="{{book.image.url}}" alt="No Image"></a>
    <p>{{book.bookname}}</p>
    <p>Rs.{{book.price}}</p>   
{% endfor %}
{% endif %}

在你看来:

相反:

book_name =  request.POST.getlist('search')

尝试:

book_name =  request.POST.get('search')

相关问题 更多 >