博客五部曲之一 - 简单博客
1453 浏览 5 years, 11 months
37 搜索
版权声明: 转载请注明出处 http://www.codingsoho.com/首先,在列表页面添加一个搜索框
<form method="GET" action="">
<input type="text" name="q" placeholder="Search posts" value="{{request.GET.q}}" />
<input type="submit" value="Search" />
</form>
搜索框放在一个form里,提交的方式是GET
输入框 name=”q”,当用户提交时输入框的内容会作为字典q的值提交,URL形式为?q=,视图可以通过request.GET.get(“q”)获取。
Value=”{{request.GET.q}}”是将搜索的内容回显到输入框。
在视图函数post_list里面添加对搜索内容的过滤,下面代码中搜索标题里是否含有对应的内容
def post_list(request):
queryset_list = Post.objects.active()
if request.user.is_staff or request.user.is_superuser:
queryset_list = Post.objects.all()
query = request.GET.get("q")
if query:
queryset_list = queryset_list.filter(title__icontains=query)
但是有的时候,需要对多个字段进行搜索,这就需要用到Django的另一个库Q了
https://docs.djangoproject.com/en/1.11/topics/db/queries/#complex-lookups-with-q-objects
from django.db.models import Q
def post_list(request):
query = request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(user__first_name__icontains=query) |
Q(user__last_name__icontains=query)
).distinct()
注意修改翻页的模板以兼容q查询,URL里面添加q参数
<div class="pagination">
<span class="step-links">
{% if object_list.has_previous %}
<a href="?{{page_var}}={{ object_list.previous_page_number }}{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">previous</a>
{% endif %}
<span class="current">
Page {{ object_list.number }} of {{ object_list.paginator.num_pages }}.
</span>
{% if object_list.has_next %}
<a href="?{{page_var}}={{ object_list.next_page_number }}{% if request.GET.q %}&q={{request.GET.q}}{% endif %}">next</a>
{% endif %}
</span>
</div>