管理系统总结(2)
视图篇
图片、文件存储
学会的一种新存储方式,就是将文件夹按照年月日依次创建。这样子可以根据日期进行查询,而且不容易重名。
def save_img(img):
img_name = img.name
path = 'static/img'
year = str(datetime.datetime.now().strftime('%Y'))
month = str(datetime.datetime.now().strftime('%m'))
day = str(datetime.datetime.now().strftime('%Y-%m-%d'))
img_path = os.path.join(path, year, month, day)
# 正则转义斜杠需要四个才等于一个\
img_path = re.sub('\\\\', '/', img_path)
# 最终合并出文件路径和存储的文件名字
img_path_name = img_path + '/' + img_name
# 按照日期进行归类存储查看是否有当前日期的文件夹,有就存进去,没有就创建一个新的文件夹存进去。
# 下载图片到本地
if os.path.exists(img_path):
with open(img_path_name, 'wb') as f:
f.write(img.read())
else:
os.makedirs(img_path)
with open(img_path_name, 'wb') as f:
f.write(img.read())
return img_path,img_name,img_path_name
#存储文件到本地
def save_file(file):
file_name = file.name
path = 'static/file'
year = str(datetime.datetime.now().strftime('%Y'))
month = str(datetime.datetime.now().strftime('%m'))
day = str(datetime.datetime.now().strftime('%Y-%m-%d'))
file_path = os.path.join(path, year, month, day)
# 正则转义斜杠需要四个才等于一个\
file_path = re.sub('\\\\', '/', file_path)
# 最终合并出文件路径和存储的文件名字
file_path_name = file_path + '/' + file_name
# 按照日期进行归类存储查看是否有当前日期的文件夹,有就存进去,没有就创建一个新的文件夹存进去。
# 下载文件到本地
if os.path.exists(file_path):
with open(file_path_name, 'wb') as f:
f.write(file.read())
else:
os.makedirs(file_path)
with open(file_path_name, 'wb') as f:
f.write(file.read())
return file_path,file_name,file_path_name
数据验证
需要导入一个包 from django import forms
具体的验证参数可以直接百度有,不在这里具体讲诉其意。
#专家信息验证
class loginform(forms.Form):
gender = forms.ChoiceField(initial=0,choices=((0, '男'), (1, '女')),error_messages={'required':'未知错误'})
rank_groupby = forms.CharField(max_length=7,required=False,initial='')
birth_day = forms.DateTimeField(required=True,error_messages={'required':'出生年份不为空'})
age = forms.IntegerField(min_value=0,max_value=100,required=True,error_messages={'required':'年龄不能为空'}
obj = loginform(request.POST)
status = obj.is_valid()
post的数据符合loginform的限制,则返回1,否则不合法返回0
success_dict = obj.clean()
print('正确的信息',success_dict)
failed_dict = obj.errors
获取obj.clean():获取提交的所有正确数据
obj.errors():获取提交的所有错误信息
as_json是用来获取ajax信息的,也就是解析json格式
#如果填写的信息出现错误,那么就保留现有填写的信息obj,然后传递回去本页面继承,并做出提醒,让用户按照要求填写信息
if not obj.is_valid():
print(request.POST)
a = request.POST.get('data[sex]')
print(a)
data = request.POST
print('错误的信息',failed_dict)
context['data'] = data
context['msg'] = failed_dict
context['code'] = 2021
return JsonResponse(context)
搜索和分页
将搜索和分页结合在一起,前端传递的字段有:搜索的值,页数,如果需要也可以设置分页条数(一页多少条信息)。
如果搜索的内容遇到需要模糊的搜索的,可用__contains进行匹配
Professonal_user.objects.filter(personal_expertise__contains=professsion_field)
if session_user:
# 获取是否有用户输入了查询的语句,如果没有就初始页面,如果有就显示查询的页面
#通过专家姓名和学校来进行查询操作
profession_name = request.GET.get('profession_name')
professsion_work_unit = request.GET.get('professsion_school')
# 获取页面处于第几页
page = request.GET.get('page')
try:
if profession_name == '' and professsion_work_unit == '':
# 如果发现查询的条件是空的情况,那么就进入初始显示的页面,显示全部项目
# 项目总数和信息
professionals = Professonal_user.objects.all()
profession_num = len(professionals)
# 设置默认一页显示3条数据
paginator = Paginator(professionals,3)
# 分页返回数据判断
# 当用户第一次进入首页的时候,要默认返回第一位专家的详细信息
# 第一次进来的时候,page为空,之后page都有值。这样子就完成了判断,为空有默认的信息,
# 不为空,详细信息页就算再次点击第一页也不做改变
if page == '' or None:
books = paginator.page(1)
#当前用户的id
# user = request.session['session_user']
# context['id'] = user['id']
else:
try:
# 没有异常就返回正常页数的数据
books = paginator.page(page)
except PageNotAnInteger:
# 如果不是整数就返回第一页
books = paginator.page(1)
except InvalidPage:
# 如果请求的页面不存在
books = paginator.page(paginator.num_pages)
except EmptyPage:
# 如果请求的页面不在合法的页数范围内,返回结果的最后一页
books = paginator.page(paginator.num_pages)
#用于存储需要显示的专家信息的列表
professional_data_s = []
for professional in books:
professional_name = professional.pname
professional_name = secretary.private_key(crypto=professional_name)
img_path = professional.imgname.path
rank_groupby_codes = professional.rank_groupby
professional_data_s.append(
{
'professional_shcool':professional.work_unit,#专家工作单位
'professional_name':professional_name,#专家姓名
'professional_gender':gender_trans(professional.gender),#专家性别
'professional_rank':rank_groupby_codes,#专家职位
'professional_type':judge(professional.pro_type),#专家类型
'imgname': img_path, # 头像图片
'id':professional.id,
})
context['data'] = professional_data_s
context['profession_len'] = profession_num
context['code'] = 200
context['msg'] = '成功'
return JsonResponse(context)
遍历前端数据
i=0
while True:
if request.POST.get('data[fileList][%s][name]'%i)==None:
break
else:
a = request.POST.get('data[fileList][%s][name]'%i)
b =a.split('.')[0]
certificate_simple_name.append(b)
certificate_name.append(a)
i+=1
下载模板的方式
def download_file(request):
f = open('C:/Users/Administrator/PycharmProjects/profession_systems/professional_user/下载模板.xlsx', 'rb')
response = FileResponse(f)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="demo.xlsx"'
return response
数据库自关联三级联动逻辑
#担任职务的三级操作遍历逻辑
rank_groupby = []
#首先是第一级,获取所有一级目录创建列表即可。
first = Third_level.objects.filter(pid=None)
for i in first:
rank_groupby.append({
'value':i.value,
'label':i.label,
'id':i.id
})
times = 0
for i in rank_groupby:
i['children'] = []
for l in first[times].third_level_set.all():
i['children'].append({
'value':l.value,
'label':l.label,
'id':l.id,
})
times+=1
times1 = 0
for i in rank_groupby:
for j in i['children']:
j['children'] = []
times2 = 0
#把正高,副高5个级别遍历一遍获取对应的子集。
for l in first[times1].third_level_set.all():
#比如:正高对应的所有子集
for r in l.third_level_set.all():
i['children'][times2]['children'].append({
'value':r.value,
'label':r.label,
'id':r.id
})
times2+=1
times1 += 1