- 模糊搜索:
在页面生成一个表单。 以get 方式, 将数据提交到。当前查看页面。 后台接收数据,然后进行筛选过滤。
着个也需要,用户自定制!
定义一个 search_list 这个值,默认为空。 页面进行判断,为空就不显示。 搜索框!
如果,用户 定义了这个列表, 那么就显示!
class StartHandler(object):
..........
search_list = [] # 方便,用户自己定制。关键字搜索的条件,和如果用户不配置,页面不显示搜索框 def get_search_list(self): return self.search_list # ##################3. 获取排序,和, 模糊搜索的条件######################
from django.db.models import Q, F # 用于构造复杂的 搜索条件 order_list = self.get_ordered_list() # 排序方式 默认 使用 id 进行正向排序 search_list = self.get_search_list() # 搜索的条件 ["name_contains", "email"] ''' 1. 如果 search_list 为空, 则不显示 搜索框 2. 获取用户输入的 关键字 3. 构造搜索条件 ''' search_value = self.request.GET.get("q", "") # 获取用户发送过来的关键字,如果没有 q 这个参数。 就返回 None conn = Q() conn.connector = "OR" # 让添加进来的条件, 做 or 判断 if search_value: # 接收到了用户的搜索,才进行模糊查询。 否则啥都不干 for item in search_list: conn.children.append((item, search_value))
............ return render(request, "stark/changelist.html", {"header_list": header_list, "data_list": data_list, "body_list": body_list, "pager": pager, "add_btn": add_btn, "search_list": search_list, "search_value": search_value, "action_dict": action_dict})
子类中, 由用户自己定制:
class UserInfoHandler(StartHandler): ...... search_list = ["name_contains"] # 如果这里不设置的话, 就不显示搜索框
def get_search_list(self):
'''重写该方法,可以进行对用户 权限的判断。 从而决定该用户是否, 有搜索的权限'''
接下来就是一个 ,模糊搜索了: 先看一了 例子!:
from django.db.models import Q, F # 用于构造复杂的 搜索条件 conn = Q() conn.connector = "OR" # 让添加进来的条件, 做 or 判断 conn.children.append(("name__contains", "lijie")) conn.children.append(("email", "lijie")) conn.children.append(("id__gt", 5)) self.model_class.objects.filter(conn) # 这样就可以根据添加进 Q 的条件, 按照 or 的方式。在数据库查询!
ORM 无法进行,复杂的搜索条件。 所以使用 django 内置的 Q 方法来做这件事!
所以重点还是 子类中需要自定制的 search_list = ["name_contains"] 这里才是决定了。 前端更够查询到的东西。
但是,这里还是, 定死了的。 如果想要更加的灵活。 以后再说:
先看看。 整体代码吧!