1.循环的机制有问题
def containsAnyInList(list, aset):
for item in list:
if containsAny(item, aset):
return True
return False
def containsAny(seq, aset):
for c in seq:
if c in aset:
return True
return False
view_availability函数的实现
1. 获取availabilities 没有过期的对象
availabilities = Availability.objects.filter(RecordEndDate="NULL").order_by('UpdateDate')
2.判断message是否存在,得到一个popout 的功能!
if request.GET.get('message'):
message_for_add_result = request.GET.get('message')
2.判定是不是有权限!如果没有权限,删除对应的id=item.id,同时也删除过期数据
for item in availabilities:
if not can_access(item, request):
availabilities=availabilities.exclude(id=item.id)
elif not item.Property.RecordEndDate=='NULL':
availabilities=availabilities.exclude(id=item.id)
3.如果可以得到request.GET.get() 值说明可以是按了搜索的按钮了
if request.GET.get('a'):
value_lower_1 = float(request.GET.get('a'))
value_upper_1 = float(request.GET.get('b'))
value_lower_2 = float(request.GET.get('d'))
value_upper_2 = float(request.GET.get('e'))
province_name = request.GET.get('f')
filter_text = request.GET.get('c')
4.判定的逻辑:
如果省份的按钮框存在并且不是all ,删除对应的非province_name的值,
如果 filter_text的框是有值的,先创建一个value_list的列表,里面存放的 包涵的选择项,应该是每一个item的选择项,是用一个函数containsAnyInList判定是不是在里面,如果不在,就exclude对应的id
if province_name and province_name != 'All':
if item.Province != province_name:
availabilities=availabilities.exclude(id=item.id)
if filter_text:#search box
value_list = [item.Property.NameUnicode, item.Unit, item.AvailableDate, item.Property.Access_Nearest_IC, item.Property.Access_Nearest_Station]
if not views.containsAnyInList(value_list, filter_text):
availabilities=availabilities.exclude(id=item.id)
5.判断两个bar上的值是不是存在,如果不存在首先给0,exclude对应的不在范围里面的值:
if item.UnitRental == "":
item.UnitRental = '0'
if item.Rent_Area =="":
item.Rent_Area = '0'
try:
if float(item.UnitRental) < value_lower_1 or float(item.UnitRental) > value_upper_1:
availabilities = availabilities.exclude(id=item.id)
if float(item.Rent_Area)< value_lower_2 or float(item.Rent_Area) > value_upper_2:
availabilities = availabilities.exclude(id=item.id)
except:
availabilities = availabilities.exclude(id=item.id)
6.初始化对应bar 的值,四个框里面的值,利用的函数checkrange
output_one = views.checkrange(availabilities,'UnitRental',request)#??? 'ProjectArea',UnitRental,Rent_Area
output_two = views.checkrange(availabilities,'Rent_Area',request)
price_min_range_one = output_one.min_range
price_max_range_one = output_one.max_range
price_min_range_two = output_two.min_range
price_max_range_two = output_two.max_range
7.返回值render_to_response,
render_to_response(ui_sets['search_availability_list'], {'price_min_range_one':price_min_range_one,'price_max_range_one':price_max_range_one,'price_min_range_two':price_min_range_two,'price_max_range_two':price_max_range_two,
'availabilities': availabilities, 'message_for_add_result': message_for_add_result,
'untable_selection_box':untable_selection_box,
}, context_instance = RequestContext(request))
2. view_availability函数的改进,完整代码如下
@login_required
def view_availability(request):
availabilities = Availability.objects.filter(RecordEndDate="NULL").order_by('UpdateDate')
message_for_add_result = "null"
if request.GET.get('message'):
message_for_add_result = request.GET.get('message')
for item in availabilities:
if not can_access(item, request):
availabilities=availabilities.exclude(id=item.id)
elif not item.Property.RecordEndDate=='NULL':
availabilities=availabilities.exclude(id=item.id)
else:
item.AvailableDate = str(item.AvailableDate)
if request.GET.get('a'):
value_lower_1 = float(request.GET.get('a'))
value_upper_1 = float(request.GET.get('b'))
value_lower_2 = float(request.GET.get('d'))
value_upper_2 = float(request.GET.get('e'))
province_name = request.GET.get('f')
filter_text = request.GET.get('c')
if province_name and province_name != 'All':
if item.Province != province_name:
availabilities=availabilities.exclude(id=item.id)
if filter_text:#search box
value_list = [item.Property.NameUnicode, item.Unit, item.AvailableDate, item.Property.Access_Nearest_IC, item.Property.Access_Nearest_Station]
if not views.containsAnyInList(value_list, filter_text):
availabilities=availabilities.exclude(id=item.id)
if item.UnitRental == "":
item.UnitRental = '0'
if item.Rent_Area =="":
item.Rent_Area = '0'
try:
if float(item.UnitRental) < value_lower_1 or float(item.UnitRental) > value_upper_1:
availabilities = availabilities.exclude(id=item.id)
if float(item.Rent_Area)< value_lower_2 or float(item.Rent_Area) > value_upper_2:
availabilities = availabilities.exclude(id=item.id)
except:
availabilities = availabilities.exclude(id=item.id)
output_one = views.checkrange(availabilities,'UnitRental',request)#??? 'ProjectArea',UnitRental,Rent_Area
output_two = views.checkrange(availabilities,'Rent_Area',request)
price_min_range_one = output_one.min_range
price_max_range_one = output_one.max_range
price_min_range_two = output_two.min_range
price_max_range_two = output_two.max_range
return render_to_response(ui_sets['search_availability_list'], {'price_min_range_one':price_min_range_one,'price_max_range_one':price_max_range_one,'price_min_range_two':price_min_range_two,'price_max_range_two':price_max_range_two,
'availabilities': availabilities, 'message_for_add_result': message_for_add_result,
'untable_selection_box':untable_selection_box,
}, context_instance = RequestContext(request))