2016-06-24 116 views
0

我在數據庫中有很多書籍。搜索數據庫不會返回任何內容(空的queryset)。如何在django中實現搜索功能?

在菜單中:

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

views.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 %} 
+0

適合某些用例,但您也應該查看基於文檔的搜索,以便根據您的需求發展。 https://docs.djangoproject.com/zh/dev/topics/db/search/#document-based-search – keni

回答

1

有幾件事情我想補充這裏..

1)我認爲搜索結果應該是方法GET而不是POST。你可能是指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)的views.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 %} 

這應該工作正常。

還讓你確定你有一些數據在分貝取得你的搜索結果!

+0

你能分享你的urls.py文件嗎?我認爲你已經搞砸了 –

+0

request.POST.get()沒有工作,所以我改變它request.GET.get()現在它的工作 – Bhanukiran

+0

該死!我錯過了......我會更新它。 –

1

看起來你需要使用for,因爲書籍是一個queryset

模板,嘗試:

{% 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') 
+1

@Bhanukiran看看我的編輯 –

+0

@Bhanukiran你可以展示你的模型,也許你需要使用book.id來代替book.pk –

+0

嘿,感謝它的工作 – Bhanukiran