管理系统总结(2)

管理系统总结(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值