在学习Django中,练手做了个项目,在实际编程当中发现了N多个坑,现在记录下心得体会,方便以后查询,本人Models只使用了一张表,前端HTML如下图所示,
多条件查询可以使用的技术:
Q查询
查询条件动态存档放到1个字典里面,前台根据字典传值。
如 status = { 'qq' : '123456' , 'startdate' :' 2017-02-04 ', ' typeid ' : ' 1 ' }
条件存放到字典时需要注意的是:
1、只有选中状态下,才获取查询的条件
2、页面刷新时(GET请求),即使你什么都不做,文本框的值为空字符串,所以要判断获取状态是否为真
get_qq=request.GET.get('search') #输入文本框的 name = 'search'
if get_qq: #当输入的QQ为真时,注意,刷新时,什么都不输入为空字符串
status['qq']=get_qq #==>>status={'qq':get_qq}
3、如果查询条件为空时( status={}) ,模型类.objects.filter(status) 相当于xxx.objects.all()
所以第一次打开页面,或什么条件都没选择时,要设置获取的数据对象集为空
if len(status)==0: #如果字典为空,不含有任何过滤条件,即条件都没选择
data = [] #设置数据为空
else:
data =models.Order.objects.filter(**status)
# 字典 为空字符串时 status={}
#len{status}=0
#字典为None 时 status={None}
#len(status)=1 python 3.x
这里注意下 len( { } ) len( { None } ) len(None)(报错) 的区别
对查询的结果进行分页时,需要注意的是:
1、每页获取的对象 为,当前页的对象集 Paginator.page(number).object_list
而不是总数据的对象集Paginator.object_list
2、分页的页码,是总数据的页码 Paginator.page_range
3、因为分页查询,所以form 的method 设置为 GET ,每页的查询状态 在Url 上有参数
如 www.xxx.com/ ?name=lee & age=18
注意:1、每页的Url 需要传递 查询条件参数?name=lee & key=value....
2、GET 请求只能获取? 后面的数据 如果url 网址设置 www.xxx.com/1(页面)?key=value
页码需要从浏览器获取 ,需要配置视图函数和 urls.py url(r'^list/(\d*)', list)
VIEWS.PY
def list(request,page):
#....
#....
else:
data =models.Order.objects.filter(**status)
if data:
p=Paginator(data,5) #分页 pre_page=1 每页显示1条数据
ret['p']=p
try:
#从浏览器中获取当前页码,默认为1
page=int(page)
page_object_list=p.page(page) #当前页面的对象
except:
#如果出错,如用户输入,ddd,返回第1页
page=1
page_object_list=p.page(1)
ret['page_object_list']=page_object_list