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":query 22 })
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是其中一个字段,注意连接方式(双下划线);这样写,就是搜索名字的
时间: 2024-11-13 08:09:29