from django.contrib.auth.hashers import make_password, check_password from .forms import RegForm, CheckInForm, ForgetPSWForm from .models import Organizer, CheckIn, Item, UserContent from .functions import * from Niko.settings import PRODUCTION_ENVIRONMENT from .setting import USER_UPLOAD_URL_PREFIX, QR_CODE_URL_PREFIX # Create your views here. def checkIn(request, url): # 用户注册界面 if url == 'register': if request.method == 'POST': regForm = RegForm(request.POST) if regForm.is_valid(): organizer = Organizer organizer.username = regForm.cleaned_data['username'].lower().strip() organizer.nickname = regForm.cleaned_data['nickname'].lower().strip() organizer.email = regForm.cleaned_data['email'].lower().strip() organizer.mobile = regForm.cleaned_data['mobile'] organizer.password = make_password(regForm.cleaned_data['psw1']) organizer.photo = '' # 获取注册的IP地址 try: organizer.registerIP = request.META['HTTP_X_FORWARDED_FOR'] except: organizer.registerIP = request.META['REMOTE_ADDR'] organizer.createNew(organizer) organizer = Organizer.searchByUsername(organizer) request.session['loginUser'] = organizer.username request.session['loginID'] = organizer.ID request.session['loginNickname'] = organizer.nickname return render(request, 'checkIn/directPage.html', {'alertMsg': '用户创建成功。', 'dirLink': '/checkIn/main'}) else: return render(request, 'checkIn/register.html', {'registerForm': regForm}) else: return render(request, 'checkIn/register.html', {'registerForm': RegForm}) if url == 'login': # 用户登录页面 if request.method == 'POST': organizer = Organizer organizer.username = request.POST['username'].strip().lower() organizer = Organizer.searchByUsername(organizer) if organizer == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '用户名不存在。', 'dirLink': '/checkIn/login/'}) if check_password(request.POST['password'], organizer.password): request.session['loginUser'] = organizer.username request.session['loginID'] = organizer.ID request.session['loginNickname'] = organizer.nickname return render(request, 'checkIn/directPage.html', {'alertMsg': '登录成功。', 'dirLink': '/checkIn/main/'}) else: return render(request, 'checkIn/directPage.html', {'alertMsg': '用户名或者密码错误。', 'dirLink': '/checkIn/login/'}) else: if getSession(request, 'loginID'): # 如果检测到用户已经登陆就直接跳转 return HttpResponseRedirect('/checkIn/main') else: return render(request, 'checkIn/login.html') # 忘记密码 if url == 'forgetPSW': if checkSession(request, 'loginUser') and checkSession(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '你已经登录了。', 'dirLink': '/'}) if request.method == 'POST': organizer = Organizer form = ForgetPSWForm(request.POST) if form.is_valid(): organizer.username = form.cleaned_data['username'] organizer = Organizer.searchByUsername(organizer) if organizer.mobile == form.cleaned_data['mobile']: organizer.password = make_password('qaz123') Organizer.updateByID(organizer) return render(request, 'checkIn/directPage.html', {'alertMsg': '你的密码已经更改为 qaz123。', 'dirLink': '/checkIn/login'}) else: return render(request, 'checkIn/forgetPSW.html', {'forgetPSWForm': form, 'alert': '你的手机号码与注册的不符。'}) else: del organizer return render(request, 'checkIn/forgetPSW.html', {'forgetPSWForm': form}) # 正常渲染页面 else: form = ForgetPSWForm() return render(request, 'checkIn/forgetPSW.html', {'forgetPSWForm': form}) if url == 'main': # 用户登陆后的页面 if not checkLoginUser(request): return render(request, 'checkIn/directPage.html', {'alertMsg': '登录错误。', 'dirLink': '/checkIn/logout'}) checkIn = CheckIn checkIn.o_ID = getSession(request, 'loginID') existingList = CheckIn.getExistingList(checkIn) # 获取名下的checkIn集合 nickname = request.session['loginNickname'] return render(request, 'checkIn/main.html', {'existingList': existingList, 'nickname': nickname}) if url == 'newCheckIn': # 用户创建新的CheckIn项目 if not checkLoginUser(request): return render(request, 'checkIn/directPage.html', {'alertMsg': '请重新登录。', 'dirLink': '/'}) checkIn = CheckIn if request.method == 'POST': form = CheckInForm(request.POST) if form.is_valid(): if request.GET.get('ID'): # 如果是更新话,先读取原始数据 checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.startTime = form.cleaned_data['startTime'] checkIn.endTime = form.cleaned_data['endTime'] checkIn.o_ID = request.session['loginID'] checkIn.description = form.cleaned_data['description'] checkIn.maxNum = form.cleaned_data['maxNum'] # checkIn.creatorConfirm = form.cleaned_data['creatorConfirm'] # checkIn.captcha = form.cleaned_data['captcha'] if request.GET.get('ID'): # 如果是更新话,就能获取check In ID,然后调用这一段。 CheckIn.updateByID(checkIn) return HttpResponseRedirect('/checkIn/checkInDetail/?ID=%s' % (checkIn.ID)) else: # 如果是新建的话,GET里面没有ID c_ID = CheckIn.createNew(checkIn) if c_ID == 0: # 检测到重名 alert = '你创建的活动重名了。' return render(request, 'checkIn/newCheckIn.html', {'form': form, 'alert': alert}) else: return HttpResponseRedirect('/checkIn/newItems/?ID=%s' % (c_ID)) # 普通打开页面,不是POST if request.GET.get('ID'): # 如果GET来ID数据的话,就填充表格,修改原有数据 checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) if not checkIn: return render(request, 'checkIn/directPage.html', {'alertMsg': '这个ID不存在。', 'dirLink': '/'}) else: form = CheckInForm data = {'startTime': str(checkIn.startTime), 'description': checkIn.description.strip(), 'o_ID': checkIn.o_ID} if checkIn.endTime: data['endTime'] = str(checkIn.endTime) data['maxNum'] = checkIn.maxNum data['creatorConfirm'] = checkIn.creatorConfirm data['captcha'] = checkIn.captcha form = CheckInForm(data) return render(request, 'checkIn/newCheckIn.html', {'form': form}) else: # 创建新的checkIn # data = {'o_ID': request.session.get('loginID')} form = CheckInForm() # confirmList = [('0', '无需验证'), ('1', '点击确认')] # form.declared_fields['creatorConfirm'].choices = confirmList return render(request, 'checkIn/newCheckIn.html', {'form': form}) if url == 'newItems': # 用户在新的checkIn项目下添加活动内容 if not checkLoginUser(request): return render(request, 'checkIn/directPage.html', {'alertMsg': '请重新登录。', 'dirLink': '/'}) item = Item if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) item.c_ID = request.GET['ID'] checkIn = CheckIn checkIn.ID = item.c_ID checkIn = CheckIn.searchByID(checkIn) if checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) if request.method == 'POST': # 新建条目 item.o_ID = getSession(request, 'loginID') checkIn = CheckIn() checkIn.ID = item.c_ID checkIn = CheckIn.searchByID(checkIn) item.c_description = checkIn.description.strip() item.description = request.POST['description'].strip() # 检验重名的Item if Item.sameItem(item): return render(request, 'checkIn/directPage.html', {'alertMsg': '重名了', 'dirLink': '/checkIn/newItems'}) item.type = request.POST['type'] if checkPOST(request, 'uniqueItem'): item.unique = True else: item.unique = False if checkPOST(request, 'reservedFlag'): item.reservedFlag = True item.reservedContent = request.POST['reservedContent'].strip() else: item.reservedFlag = False item.reservedContent = '' if item.type in ['4', '5', '6']: # 如果是单选选项需要在选项数据库里面输入 item.itemSelection = request.POST['itemSelection'].strip() # 验证完成,创建item Item.createNew(item) existItemList = Item.searchByC_ID(item) return render(request, 'checkIn/newItems.html', {'existItemList': existItemList}) else: existItemList = Item.searchByC_ID(item) return render(request, 'checkIn/newItems.html', {'existItemList': existItemList, 'checkInDesc': checkIn.description}) if url == 'logout': request.session.clear() return render(request, 'checkIn/directPage.html', {'alertMsg': '成功退出。', 'dirLink': '/'}) if url == 'checkInDetail': checkIn = CheckIn if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) request.session['checkInDesc'] = checkIn.description request.session['checkInID'] = checkIn.ID return render(request, 'checkIn/checkInDetail.html', {'checkIn': checkIn}) # 更新item if url == 'itemUpdate': item = Item # 提交表单后更新数据 if request.method == 'POST': # 读取item数据 if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) item.ID = request.GET['ID'] item = Item.searchByID(item) item.description = request.POST['description'].strip() item.type = request.POST['type'] item.itemSelection = request.POST['itemSelection'] if checkPOST(request, 'uniqueItem'): item.unique = True else: item.unique = False if checkPOST(request, 'reservedFlag'): item.reservedFlag = True item.reservedContent = request.POST['reservedContent'].strip() else: item.reservedFlag = False item.reservedContent = '' # 更新数据 Item.updateItemByID(item) return HttpResponseRedirect('/checkIn/newItems/?ID=%s' % (item.c_ID)) # 非POST if request.method == 'GET': try: if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) item.ID = request.GET['ID'] item = Item.searchByID(item) if (not checkCorrectO_ID(request, item.o_ID)) or item == '': return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) return render(request, 'checkIn/itemUpdate.html', {'item': item}) except Exception as e: print(e) return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) # 更新用户资料 if url == 'updateInfo': organizer = Organizer if not checkSession(request, 'loginID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '你还没有登录。', 'dirLink': '/'}) organizer.ID = getSession(request, 'loginID') organizer = Organizer.searchByID(organizer) if request.method == 'POST': form = RegForm(request.POST) form.fields['psw1'].required = False form.fields['psw2'].required = False form.fields['username'].widget.attrs['readonly'] = 'readonly' if form.is_valid(): if form.cleaned_data['psw1'] is not None: organizer.password = make_password(form.cleaned_data['psw1']) organizer.nickname = form.cleaned_data['nickname'] organizer.mobile = form.cleaned_data['mobile'] organizer.email = form.cleaned_data['email'] Organizer.updateByID(organizer) return HttpResponseRedirect('/checkIn/main') else: return render(request, 'checkIn/updateInfo.html', {'form': form}) else: form = RegForm(initial={'username': organizer.username, 'nickname': organizer.nickname, 'email': organizer.email, 'mobile': organizer.mobile, 'updateFlag': 'update', 'originalMobile': organizer.mobile}) form.fields['psw1'].required = False form.fields['psw2'].required = False form.fields['username'].widget.attrs['readonly'] = 'readonly' return render(request, 'checkIn/updateInfo.html', {'form': form}) # 生成二维码,并准备发布 if url == 'public': checkIn = CheckIn if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '这个ID不存在。', 'dirLink': '/'}) else: scheme = request.scheme host = request.get_host() import qrcode qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=10, border=1) url = '%s://%s/checkIn/user/checkIn/?ID=%s' % (scheme, host, checkIn.ID) qr.add_data(url) qr.make(fit=True) img = qr.make_image() import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) imgLoc = '%s\\checkIn\\static\\media\\qrcode\\c_ID_%s.png' % (BASE_DIR, checkIn.ID) img.save(imgLoc) if PRODUCTION_ENVIRONMENT: from .setting import QR_CODE_URL_PREFIX qrcode_prefix = QR_CODE_URL_PREFIX else: qrcode_prefix = '/static/media/qrcode/' img_url = qrcode_prefix + 'c_ID_{}.png'.format(checkIn.ID) # 需要在服务器上添加checkIn_media为静态目录 status = {} status['code'] = checkIn.status if status['code'] == 'draft': status['desc'] = '准备中' elif status['code'] == 'active': status['desc'] = '进行中' elif status['code'] == 'pause': status['desc'] = '暂停' return render(request, 'checkIn/public.html', {'url': url, 'image': img_url, 'c_ID': checkIn.ID, 'status': status, 'description': checkIn.description}) # 组织者查看活动记录 if url == 'checkInStatus': checkIn = CheckIn checkInResult = UserContent if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) # 验证checkIn 用户和登录用户是否一致。 if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) checkInResult.c_ID = checkIn.ID result = UserContent.getContentList(checkInResult) # result = mongoSearchByID(checkIn.ID) result2 = None keys = None types_in_CheckIn = Item.get_types_by_cID_asc(checkIn.ID) types = [] for t in types_in_CheckIn: types.append(t['type']) if len(result) != 0: keys = list(eval(result[0]['content']).keys()) keys_iterator = iter(keys) result2 = [] for x in result: single_line_result = list(eval(x['content']).values()) i = 0 single_line_result2 = [] while i < len(single_line_result): single_cell_result = {'value': single_line_result[i], 'type': types[i]} single_line_result2.append(single_cell_result) i += 1 result2.append(single_line_result2) file_type_list = [6, 7] non_file_type_list = [0, 1, 2, 3, 4, 5] url_prefix = USER_UPLOAD_URL_PREFIX if not PRODUCTION_ENVIRONMENT: url_prefix = '/static/media/user_upload/' return render(request, 'checkIn/checkInStatus.html', {'result': result2, 'keys': keys, 'c_ID': checkIn.ID, 'isFile': file_type_list, 'isNotFile': non_file_type_list, 'url_prefix': url_prefix}) # 下载CSV if url == 'getCSV': checkIn = CheckIn checkInResult = UserContent if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) # 验证checkIn 用户和登录用户是否一致。 if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) # 获取数据,生成response response = HttpResponse(content_type='text/csv;charset=ANSI') response['Content-Disposition'] = 'attachment; filename="checkIn_%s.csv"' % (checkIn.ID) import csv writer = csv.writer(response) checkInResult.c_ID = checkIn.ID result = UserContent.getContentList(checkInResult) types_in_CheckIn = Item.get_types_by_cID_asc(checkIn.ID) types = [] for t in types_in_CheckIn: types.append(t['type']) file_type_list = [6, 7] non_file_type_list = [0, 1, 2, 3, 4, 5] url_prefix = USER_UPLOAD_URL_PREFIX if not PRODUCTION_ENVIRONMENT: url_prefix = '/static/media/user_upload/' # result = mongoSearchByID(checkIn.ID) keys = eval(result[0]['content']).keys() writer.writerow(keys) # result2 = [] for x in result: record = eval(x['content']).values() record_list = list(record) i = 0 while i < len(types): if types[i] in file_type_list: record_list[i] = 'http://' + request.get_host() + url_prefix + record_list[i] else: # 添加一个tab,用来避免excel打开身份证号码最后几位显示为0的问题 record_list[i] = '\t' + record_list[i] i += 1 writer.writerow(record_list) return response # 更改活动状态 if url == 'statusChange': checkIn = CheckIn if not checkGET(request, 'status'): return render(request, 'checkIn/directPage.html', {'alertMsg': 'status错误', 'dirLink': '/'}) if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入cID或者cID错误', 'dirLink': '/checkIn/logout'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) allowedStatus = {'draft': '准备中', 'active': '进行中', 'pause': '暂停'} if request.GET['status'] in allowedStatus.keys(): # 判断当前c_ID下item是否为空 item = Item() item.c_ID = request.GET['c_ID'] item = Item.searchByC_ID(item) if len(item) == 0: return render(request, 'checkIn/directPage.html', {'alertMsg': '项目收集信息为空,请添加至少一项。', 'dirLink': '/checkIn/checkInDetail/?ID=%s' % ( checkIn.ID)}) else: checkIn.status = request.GET['status'] CheckIn.updateByID(checkIn) statusDesc = '反馈收集已经更改成%s状态了' % (allowedStatus[checkIn.status]) return render(request, 'checkIn/directPage.html', {'alertMsg': statusDesc, 'dirLink': '/checkIn/public/?ID=%s' % (checkIn.ID)}) else: return render(request, 'checkIn/directPage.html', {'alertMsg': '参数错误', 'dirLink': '/checkIn/logout'}) # 删除checkIn if url == 'deleteCheckIn': checkIn = CheckIn() if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入cID或者cID错误', 'dirLink': '/checkIn/logout'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn is None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) checkIn.status = 'delete' CheckIn.updateByID(checkIn) return HttpResponseRedirect('/checkIn/main') # 删除Item if url == 'deleteItem': if not checkGET(request, 'itemID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入itemID', 'dirLink': '/'}) item = Item item.ID = request.GET.get('itemID') item = Item.searchByID(item) c_ID = item.c_ID if (not checkCorrectO_ID(request, item.o_ID)) or item == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) if Item.deleteByID(item): return HttpResponseRedirect('/checkIn/newItems/?ID=%s' % (c_ID)) else: return HttpResponse('系统错误。') # 删除活动数据 if url == "deleteContent": if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入cID或者cID错误', 'dirLink': '/checkIn/logout'}) # 判断是不是本人的checkIn checkIn = CheckIn() checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if checkIn.o_ID != request.session['loginID']: del checkIn return render(request, 'checkIn/directPage.html', {'alertMsg': '非本人的活动项目!', 'dirLink': '/checkIn/logout'}) userContent = UserContent() userContent.c_ID = request.GET['c_ID'] if UserContent.clearByC_ID(userContent): checkIn.status = 'draft' # 重置checkIn的状态为Draft CheckIn.updateByID(checkIn) del checkIn del userContent return HttpResponseRedirect('/checkIn/checkInDetail/?ID=%s' % (request.GET['c_ID'])) # 打印版本 if url == 'print': checkIn = CheckIn if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '这个ID不存在。', 'dirLink': '/'}) else: if not PRODUCTION_ENVIRONMENT: qrcode_prefix = '/static/media/qrcode/' else: from .setting import QR_CODE_URL_PREFIX qrcode_prefix = QR_CODE_URL_PREFIX img_url = qrcode_prefix + 'c_ID_%s.png' % (checkIn.ID) # 需要在服务器上添加checkIn_media为静态目录 return render(request, 'checkIn/print.html', {'url': url, 'image': img_url, 'description': checkIn.description}) # 排序移动 if url == 'itemMove': item = Item item.ID = request.POST.get('item_id') original_item_id = request.POST.get('item_id') item = item.searchByID(item) items = item.search_by_checkIn(item.c_ID) for i, item in enumerate(items): print(i) # print(item.timestamp) if item.ID == int(original_item_id): # 找到目标 if request.POST.get('direction') == 'up': # 如果是向上替换 if i == 0: break # 如果排序第一个,就跳出 else: target_item = Item.search_by_ID(items[i-1].ID) origin_item = Item.search_by_ID(items[i].ID) temp_timestamp = origin_item.timestamp origin_item.timestamp = target_item.timestamp target_item.timestamp = temp_timestamp origin_item.save() target_item.save() break if request.POST.get('direction') == 'down': # 如果是向上替换 if i == len(items)-1: break # 如果排序最后一个,就跳出 else: target_item = Item.search_by_ID(items[i+1].ID) origin_item = Item.search_by_ID(items[i].ID) temp_timestamp = origin_item.timestamp origin_item.timestamp = target_item.timestamp target_item.timestamp = temp_timestamp origin_item.save() target_item.save() break return HttpResponse('change sequence successful.') def index(request): # Homepage return render(request, 'checkIn/index.html') def index_pjh(request): # Homepage return render(request, 'checkIn/index_pjh.html')