首页 > 代码库 > django搜索页面,并解决“Related Field has invalid lookup: icontains”错误

django搜索页面,并解决“Related Field has invalid lookup: icontains”错误

django版本1.4.5

一般网站都是需要搜索栏目的,我的项目也需要,于是做了

首先,写视图

 1 #这个并不是我的项目,仅仅用它做个例子,解决相关问题 2 from django.db.models import Q 3 from models import Book 4  5 def search(request): 6     query = request.GET.get(q, ‘‘) 7     if query: 8         qset = ( 9                 Q(title__icontains=query) |10                 Q(authors__first_name__icontains=query) |11                 Q(authors__last_name__icontains=query)12                 )13 #注意上面的字段,他们在models里都是一对一的14 #但是在我的项目里,author是外键,所以,这里有15 #非一对一的字段时会出现错误,解决方法后面讲16         results = Book.objects.filter(qset).distinct()17     else:18         results = []19     return render_to_response("books/search.html", {20         "results":results,21         "query":query22         })
Views.py

视图中,注意Q后面的类型,若是非一对一的,会出错,需要修改,后面说解决方法

还有,需要注意 双 下划线

接下来写前端代码

 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">  2 <html lang="en">  3 <head>  4     <title>Search{% if query %} Results{% endif %}</title>  5 </head>  6 <body>  7   <h1>Search</h1>  8   <form action="." method="GET">  9     <label for="q">Search: </label> 10     <input type="text" name="q" value="{{ query|escape }}"> 11     <input type="submit" value="Search"> 12   </form> 13 14   {% if query %} 15     <h2>Results for "{{ query|escape }}":</h2> 16 17     {% if results %} 18       <ul> 19       {% for book in results %} 20         <li>{{ book|escape }}</l1> 21       {% endfor %} 22       </ul> 23     {% else %} 24       <p>No books found</p> 25     {% endif %} 26   {% endif %} 27 </body> 28 </html> 
search.html

很简单的代码,主要用于学习,注意escape,是用来转义的,防止某些特殊字符引起的安全问题

由于我的项目中author是一个外键,所以,使用上面的方法出现Related Field has invalid lookup: icontains错误

由于author字段不是一对一的,所以在使用时它会自动与自己的ID关联,也就是与其本身的主键关联,这样就乱了

所以出错了

解决方法,把原来的写成这样:Q(author__Name__icontains=query)

解释一下,author是一个表,Name是其中一个字段,注意连接方式(双下划线);这样写,就是搜索名字的

django搜索页面,并解决“Related Field has invalid lookup: icontains”错误