一、员工注册视图的使用

class UserRegisterView(View):
    def get(self, request):  # 显示登录页
        return render(request, 'register.html', {'form': UserRegisterForm()})  # 渲染模板
    def post(self, request):  # 提交页面表单
        form = UserRegisterForm(request.POST)  # 接收Form表单

        #用admin的字段email控制注册功能
        if User.objects.get(username="admin").email == '0':
            messages.add_message(request, messages.ERROR, '员工注册功能已关闭,请联系管理员开放!')  # 提示错误消息
            return render(request, 'register.html', {'form': form})  # 渲染模板

        if form.is_valid():  # 验证表单
            user_id = request.POST['user_id']  # 获取工号
            user_name = request.POST['user_name']  # 获取姓名
            password = request.POST['password']  # 获取密码
            password2 = request.POST['password2']  # 获取密码
            if User.objects.filter(username=user_id):
                messages.add_message(request, messages.ERROR, '工号已存在,请确认后重新输入!')  # 提示错误信息
            elif password != password2:
                messages.add_message(request, messages.ERROR, '二次密码不一致,请重新输入!')  # 提示错误信息
            else:
                d = {
                    'username': user_id,
                    'password': password,
                    'first_name':user_name,
                    'last_name':"未赋权",
                    'is_superuser': 1,
                    'is_active': 1,
                    'is_staff': 1
                }
                user = User.objects.create_user(**d)
                user.save()
                django_logout(request)
                return HttpResponseRedirect('/index/')
        return render(request, 'register.html', {'form': form})  # 渲染模板
#对应注册Form
class UserRegisterForm(forms.Form):#UserRegisterForm()
    user_id = forms.CharField(
        label='工号',
        required=True,
        max_length=11,
        widget=forms.TextInput(attrs={
            'class': 'form-control mb-0',
            'placeholder': "请输入工号"
        }),
        error_messages={
            'required': '工号不能为空',
            'max_length': '长度不能超过10个字符',
        }
    )
    user_name = forms.CharField(
        label='真实姓名',
        required=True,
        max_length=20,
        widget=forms.TextInput(attrs={
            'class': 'form-control mb-0',
            'placeholder': "请输入真实姓名,方可使用本系统"
        }),
        error_messages={
            'required': '姓名不能为空',
            'max_length': '长度不能超过20个字符',
        }
    )
    password = forms.CharField(
        label='密码',
        required=True,
        min_length = 3,
        max_length = 50,
        widget=forms.PasswordInput(attrs={
            'class': 'form-control mb-0',
            'placeholder':"请输入密码"
        }),
        error_messages={
            'required': '密码不能为空',
            'min_length': '长度不能少于3个字符',
            'max_length': '长度不能超过50个字符',
        }
    )
    password2 = forms.CharField(
        label='确认密码',
        required=True,
        min_length = 3,
        max_length = 50,
        widget=forms.PasswordInput(attrs={
            'class': 'form-control mb-0',
            'placeholder':"请再次输入密码"
        }),
        error_messages={
            'required': '密码不能为空',
            'min_length': '长度不能少于3个字符',
            'max_length': '长度不能超过50个字符',
        }
    )

二、setattr语句在python和Django中应用。工夫不负有心人,找到了setattr语句,该语句在Django操作数据库语句中的使用,使程序节省了大量的判断语句和循环语句,甚至实现了原来很复杂的语句功能,值得学习和记录。

# 导入月流量
def liuliang(request): 
    if request.session['permissions'] != '***' and request.session['permissions'] != '***':  # 验证权限
        return render(request, "addall.html", {"msg": "sorry,你没有权限!"})

    """导入excel表数据"""
    excel_file = request.FILES.get('equfile', '')  # 获取前端上传的文件
    if not excel_file:
        return render(request, "liuliang.html", {"msg": "未选择文件,请选择文件"})

    file_type = excel_file.name.split('.')[1]  # 拿到文件后缀
    if file_type not in ['xlsx', 'xls']:  # 支持这两种文件格式
        return render(request, "liuliang.html", {"msg": "导入失败:文件格式错误,请上传正确格式的文件!"})

    a = excel_file.name.split('.')[0]  # 拿到文件名
    if len(a) != 6 or str(a).isdigit == False:
        return render(request, "liuliang.html", {"msg": "文件名不合法,请重新选择或修改文件名!"})
    if int(a[0:4]) < 2022 or int(a[4:6]) < 1 or int(a[4:6]) > 12:
        return render(request, "liuliang.html", {"msg": "时间早于起始时间,请核实重选!"})

    begin_date = datetime.strptime("202204", "%Y%m")
    end_date = datetime.strptime(str(excel_file)[0:6], "%Y%m")
    if get_months(begin_date, end_date) < 0:  # 相差月份为负数,退出
        return render(request, "liuliang.html", {"msg": "时间早于起始时间,请核实重选!"})
 #69列循环存储
    fieldnum = get_months(begin_date, end_date) % 69
    fieldsarr = ["y202204", "y202205", "y202206", "y202207", "y202208", "y202209", "y202210", "y202211", "y202212",
              "y202301", "y202302", "y202303", "y202304", "y202305", "y202306", "y202307", "y202308", "y202309",
              "y202310", "y202311", "y202312", "y202401", "y202402", "y202403", "y202404", "y202405", "y202406",
              "y202407", "y202408", "y202409", "y202410", "y202411", "y202412", "y202501", "y202502", "y202503",
              "y202504", "y202505", "y202506", "y202507", "y202508", "y202509", "y202510", "y202511", "y202512",
              "y202601", "y202602", "y202603", "y202604", "y202605", "y202606", "y202607", "y202608", "y202609",
              "y202610", "y202611", "y202612", "y202701", "y202702", "y202703", "y202704",
              "y202705", "y202706", "y202707", "y202708", "y202709", "y202710", "y202711", "y202712", ]

    data = xlrd.open_workbook(filename=None, file_contents=excel_file.read())# 打开工作文件
    tables = data.sheets()  # 得到excel中数据表sheets1,sheets2...
    x = y = z = 0
    # 循环获取每个数据表中的数据并写入数据库
    for table in tables:
        rows = table.nrows  # 总行数
        try:
            with transaction.atomic():  # 控制数据库事务交易
                # 获取数据表中的每一行数据写入设计好的数据库表
                for row in range(1, rows):  # 从1开始是为了去掉表头
                    row_values = table.row_values(row)  # 每一行的数据
                    if row_values[1] is None or row_values[1] == "":  # 流量数据不存在,进入下一行
                        z = z + 1
                        continue
                    if models.yunbo.objects.filter(iccid=str(row_values[0])).exists():
                        model = models.yunbo.objects.get(iccid=str(row_values[0]))
                        setattr(model, fieldsarr[fieldnum], str(round(MB_value(str(row_values[1])),3))+'MB')#round(a,3)保留3位小数
                        model.save()
                        x = x + 1
                        liuliang_to_countuse(row_values[0])
                    else:
                        y = y + 1
            if x == 0:
                return render(request, "liuliang.html", {"msg": "导入失败:未搜到合格ICCID!"})
        except Exception as e:
            return render(request, "liuliang.html", {"msg": "导入失败:" + str(e)})
    return render(request, "liuliang.html", {"msg": "月流量成功导入:" + str(x) + "条;有ICCID无流量值:" + str(z) + "条;ICCID不存在数量:" + str(y) + "条。请刷新表格查看!"})

三、md5 和 API接口初次应用

import hashlib, json ,requests
def to_md5(str):
    md5 = hashlib.md5()
    md5.update(str.encode("utf-8"))
    return md5.hexdigest()

@login_required
def more(request):
    if request.method=='GET':
        return render(request, 'z_more.html')
    else:
        iccid = request.POST.get("iccid", None)
        cardType = request.POST.get("cardType", None)
        print("cardType:" + cardType)
        tKey = datetime.now().strftime('%Y%m%d%H%M%S')
        passWord = to_md5(to_md5("*********") + tKey)
        url = 'https://api.******.cn/api/v1/card/moreQueryCardInfo'
        headers = {"Content-Type": "application/json"}
        data = {
            "userName": "******",
            "passWord": passWord,
            "tKey": tKey,
            "iccids": iccid,
            "cardType": cardType
        }
        reponse = requests.post(url=url, headers=headers, data=json.dumps(data))  # 接口请求
        data = reponse.json()
        return JsonResponse(data, safe=False)

四、搜索的实现函数语句

def search(request):
    #获取前台数据
    iccid=request.GET.get("iccid")
    simid=request.GET.get("simid")
    yys=request.GET.get("yys")
    ks=request.GET.get("ks")
    combo=request.GET.get("combo")
    equid=request.GET.get("equid")
    plat=request.GET.get("plat")
    equname=request.GET.get("equname")
    sdcode_id=request.GET.get("sdcode_id")
    area=request.GET.get("area")
    village=request.GET.get("village")
    activatedate=request.GET.get("activatedate")
    productdate=request.GET.get("productdate")
    putindate=request.GET.get("putindate")
    begindate=request.GET.get("begindate")
    sdname=request.GET.get("sdname")
    stopsign=request.GET.get("stopsign")

    search_dict = dict()  #定义查询字典,非空加入字典
    if iccid != "":   search_dict["iccid__contains"] = iccid # 如果查询条件不为空就写入到字典中
    if simid != "":   search_dict["simid__contains"] = simid
    if yys != "":   search_dict["yys__contains"] = yys
    if ks != "":   search_dict["ks__contains"] = ks
    if equid != "":   search_dict["equid__contains"] = equid
    if plat != "":   search_dict["plat__contains"] = plat
    if area != "":   search_dict["area__contains"] = area
    if combo != "":   search_dict["combo__contains"] = combo
    if equname != "":   search_dict["equname__contains"] = equname
    if sdcode_id != "":   search_dict["sdcode_id"] = sdcode_id  #外键不能使用__contains 属性
    if village != "":   search_dict["village__contains"] = village
    if sdname != "":   search_dict["sdname__contains"] = sdname
    if stopsign != "":   search_dict["stopsign"] = stopsign
    if activatedate != "":  search_dict["activatedate"] = datetime.strptime(activatedate, "%Y-%m-%d")
    if productdate != "":  search_dict["productdate"] = datetime.strptime(productdate, "%Y-%m-%d")
    if putindate != "":  search_dict["putindate"] = datetime.strptime(putindate, "%Y-%m-%d")
    if begindate != "":  search_dict["begindate"] = datetime.strptime(begindate, "%Y-%m-%d")

    nowPage = request.GET.get("page")
    limit = request.GET.get("limit")
    if limit == "":
        limit = 10
    equ = models.yunbo.objects.values().filter(**search_dict) #查询字典
    paginator = Paginator(list(equ), int(limit))
    if int(nowPage) >= int(paginator.num_pages):
        nowPage = paginator.num_pages
    try:
        page = paginator.page(nowPage)
    except:
        page = paginator.page(paginator.num_pages)
    data = {
          'data':list(page),
          'code':"200",
          'count':paginator.count,
          'page':page.number,
          'limit':page.__len__(),
          'pages':paginator.num_pages

     }
    return  JsonResponse(data)
//模糊查询
                    $('.dataFrm .search_btn').on('click', function () {
                        var iccid = $('#iccid').val();
                        var simid = $('#simid').val();
                        var yys = $('#yys').val();
                        var ks = $('#ks').val();
                        var combo = $('#combo').val();
                        var equid = $('#equid').val();
                        var plat = $('#plat').val();
                        var equname = $('#equname').val();
                        var sdcode_id = $('#sdcode_id').val();
                        var area = $('#area').val();
                        var village = $('#village').val();
                        var activatedate = $('#activatedate').val();
                        var begindate = $('#begindate').val();
                        var putindate = $('#putindate').val();
                        var productdate = $('#productdate').val();
                        var sdname = $('#sdname').val();
                        var stopsign = $('#stopsign').val();
                        //执行重载
                        if (iccid == "" && simid == ""&& yys == ""&& ks == ""&& combo == ""&&equid == ""&&sdname==""
                            &&plat == ""&& equname == ""&&sdcode_id == ""&&area == ""&&  village == ""&&activatedate == ""
                            &&activatedate == ""&& begindate == ""&& putindate == ""&& productdate == ""&&stopsign=="") {
                            layer.msg("请至少输入一项数据再查询")
                        } else {
                            table.reload('table', {
                                url: "/search/"
                                , method: "get"
                                , where: {
                                    "iccid": iccid,
                                    "simid": simid,
                                    "yys": yys,
                                    "ks": ks,
                                    "combo": combo,
                                    "equid": equid,
                                    "plat": plat,
                                    "equname": equname,
                                    "sdcode_id":sdcode_id,
                                    "area": area,
                                    "village": village,
                                    "activatedate": activatedate,
                                    "begindate": begindate,
                                    "productdate": productdate,
                                    "putindate": putindate,
                                    "sdname":sdname,
                                    "stopsign":stopsign,
                                }
                                , page: {
                                  curr: 1 //重新从第 1 页开始
                                }
                            })
                        }

                    });

五、layUI表格中单元格编辑的实现

table.on("edit(userTable)", function(obj){ //注:edit是固定事件名,test是table原始容器的属性 lay-filter="对应的值"
                        var field = obj.field
                        var value = obj.value
                        var data = obj.data
                        var iccid = data.iccid
                        $.ajax({
                            url:"/mytable/",
                            data:{
                                 "iccid":iccid,
                                 "value":value,
                                 "field":field
                             },
                            type:"post",
                            success(res) {
                                if (res.code === 200) {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    //layer.msg(("修改成功:[ICCID号:" + data.iccid + '] ' + '已改为' + value + " !"), {icon: 6});
                                } else if (res.code === 400) {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    layer.msg("数据已存在,请核对后重新提交!", {icon: 5});
                                } else if (res.code === 500) {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    layer.msg("客户不存在或未加入系统,请核对后重新提交!", {icon: 5});
                                } else if (res.code === 600) {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    layer.msg("时间已超过系统设置,请升级或联系系统开发人员!", {icon: 5});
                                } else if (res.code === 700) {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    layer.msg("阈值必须在0-1之间!", {icon: 5});

                                } else if (res.code === 800) {
                                $(".layui-laypage-btn")[0].click();  //页面刷新
                                layer.msg("设备号的长度不是12位!", {icon: 5});

                                } else if (res.code === 900) {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    layer.msg("输入的不是规范整数!", {icon: 5});

                                 } else if (res.code === 1000) {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    layer.msg("你没有权限!!!", {icon: 5});
                                 }
                                 else {
                                    $(".layui-laypage-btn")[0].click();  //页面刷新
                                    layer.msg("修改失败,请核对后重新提交!", {icon: 5})
                                }
                            },
                             error(){
                                  $(".layui-laypage-btn")[0].click();  //页面刷新
                                 layer.msg("修改失败,请核对后重新提交!",{icon:5});
                             }
                        });
                     });

六、js中数据库循环读取的实现

var aURL = window.location.href;
        var show_month_num = aURL.length > 60 ? aURL.split('?')[1].split("=")[18] : 6
        var beginMouth = '2022-04-1'
        //var endMouth = '2030-12-1'
        var endMouth = getNowMonth()
        var fields = ["y202204", "y202205", "y202206", "y202207", "y202208", "y202209", "y202210", "y202211", "y202212", "y202301", "y202302", "y202303", "y202304", "y202305", "y202306", "y202307", "y202308", "y202309", "y202310", "y202311", "y202312", "y202401", "y202402", "y202403", "y202404", "y202405", "y202406", "y202407", "y202408", "y202409", "y202410", "y202411", "y202412", "y202501", "y202502", "y202503", "y202504", "y202505", "y202506", "y202507", "y202508", "y202509", "y202510", "y202511", "y202512", "y202601", "y202602", "y202603", "y202604", "y202605", "y202606", "y202607", "y202608", "y202609", "y202610", "y202611", "y202612", "y202701", "y202702", "y202703", "y202704",
            "y202705", "y202706", "y202707", "y202708", "y202709", "y202710", "y202711", "y202712",]
        var titles = getMonthsArr(beginMouth,endMouth)
        if (show_month_num < 1){ show_month_num = 1}
        if ( show_month_num > titles.length ){ show_month_num = titles.length }
        if (show_month_num > 69){ show_month_num = 69}
        {#console.log('aURL:' + aURL)#}
        {#console.log('show_month_num:' + show_month_num)#}
        {#console.log("fields列表数量:"+ fields.length);#}
        {#console.log("titles列表数量:"+ titles.length);#}
        for( i = titles.length-1; i > (titles.length - show_month_num-1); i-- ){
            // field取余数:i%69
            cols.push( {field: fields[(i%69)], title: titles[i], width: 120, align: 'center',sort: true}, )
        }
        cols.push( {fixed: 'right', title: '操作', toolbar: '#barDemo', width: 150, align: 'center' } )
        if( show_month_num != 6 ){ document.getElementById("show_month_num").value = show_month_num }
        document.getElementById("show_month_num").focus();

    //**获取当前年月 */
        function getNowMonth() {
             var date = new Date();
             var year = date.getFullYear();
             var month = date.getMonth() + 1;
             month = month > 9 ? month : "0" + month;
             return year + "-" + month;
          }

    // 获取2个日期之间的月份序列,含起始和结尾月,结束日期必须大于起始日期
        function getMonthsArr(startDate,endDate) {
                 var d1 = startDate;
                 var d2 = endDate;
                 var dateArry = [];
                 var s1 = d1.split("-");
                 var s2 = d2.split("-");
                 var mCount = 0;
                 if (parseInt(s1[0]) < parseInt(s2[0])) {
                     mCount = (parseInt(s2[0]) - parseInt(s1[0])) * 12 + parseInt(s2[1]) - parseInt(s1[1])+1;
                 } else {
                     mCount = parseInt(s2[1]) - parseInt(s1[1])+1;
                 }
                 if (mCount > 0) {
                     var startM = parseInt(s1[1]);
                     var startY = parseInt(s1[0]);
                     for (var i = 0; i < mCount; i++) {
                         if (startM < 12) {
                             dateArry[i] = startY + "年" + (startM > 9 ? startM + "月" : "0" + startM + "月");
                             startM += 1;
                         } else {
                             dateArry[i] = startY + "年" + (startM > 9 ? startM + "月" : "0" + startM + "月" );
                             startM = 1;
                             startY += 1;
                         }
                     }
                 }
                 return dateArry;
             }

七、打印机TSC TTP-244 Pro的实现

//打印开始
         function TestFun()
         {
 		 	var dpi = Get_Dpi();
         	var qudong = document.getElementById("qudong").value;
 			var bianma = document.getElementById("bianma").value;
 			var ifPrint_txt = document.getElementById("ifPrint_txt").value;
 			var rotate = document.getElementById("rotate").value;
 			var tab_speed = document.getElementById("tab_speed").value;
 			var tab_density = document.getElementById("tab_density").value;
 			var paper_length = document.getElementById("paper_length").value;
 			var paper_height = document.getElementById("paper_height").value;
 			var tab_height = document.getElementById("tab_height").value;
 			var tab_xstart = document.getElementById("tab_xstart").value;
 			var tab_ystart = document.getElementById("tab_ystart").value;
 			var bar_1 = document.getElementById("bar_1").value;
         	var bar_2 = document.getElementById("bar_2").value;
         	var data = document.getElementById("data").value;
         	var tab_xstart2 = parseInt(tab_xstart) + 255
         	var tab_xstart3 = parseInt(tab_xstart) + 510
             console.log(dpi)
             console.log(data)
             console.log(tab_xstart)
             console.log(tab_xstart2)
             console.log(tab_xstart3)

			var TSCObj
			TSCObj = new ActiveXObject("TSCActiveX.TSCLIB")
			TSCObj.ActiveXopenport(qudong)
			TSCObj.ActiveXsendcommand("SIZE "+paper_length+" mm, "+paper_height+" mm")
			TSCObj.ActiveXsendcommand("SPEED "+tab_speed)
			TSCObj.ActiveXsendcommand("DENSITY "+tab_density)
			TSCObj.ActiveXsendcommand("DIRECTION 1")
			TSCObj.ActiveXsendcommand("SET TEAR ON")
			TSCObj.ActiveXclearbuffer()
             //x边距,y边距,编码方式,条码高度,是否打印文本,斜,间隔因子2 2,打印内容
			TSCObj.ActiveXbarcode(tab_xstart, tab_ystart, bianma, tab_height, ifPrint_txt, rotate, bar_1, bar_2, data)
			TSCObj.ActiveXbarcode(tab_xstart2, tab_ystart, bianma, tab_height, ifPrint_txt, rotate, bar_1, bar_2, data)
			TSCObj.ActiveXbarcode(tab_xstart3, tab_ystart, bianma, tab_height, ifPrint_txt, rotate, bar_1, bar_2, data)
			TSCObj.ActiveXprintlabel("1","1")
			TSCObj.ActiveXcloseport()
         }





    		 //打印开始
         function TestFun()  {
            var data = document.getElementById("data").value;
            console.log("244打印机:" + data);
            var TSCObj
			TSCObj = new ActiveXObject("TSCActiveX.TSCLIB")
			TSCObj.ActiveXopenport("TSC TTP-244 Pro")//打印机型号 驱动
			TSCObj.ActiveXsendcommand("SIZE 110mm, 12mm")//标签尺寸
			TSCObj.ActiveXsendcommand("SPEED 4") //打印速度
			TSCObj.ActiveXsendcommand("DENSITY 12") //打印浓度
			TSCObj.ActiveXsendcommand("DIRECTION 1")//设置标签方向 ,DIRECTION 1 左上角 (x,y)={0,0};DIRECTION 0 右下角 (x,y)={0,0};
			TSCObj.ActiveXsendcommand("SET TEAR ON")
			TSCObj.ActiveXclearbuffer()//清除
			TSCObj.ActiveXbarcode(75, 27, 128, 45, 1, 0, 2, 2, data)//x边距,y边距,编码方式,条码高度,条码内容,斜,间隔因子2 2,打印内容
			TSCObj.ActiveXbarcode(330, 27, 128, 45, 1, 0, 2, 2, data)//x边距,y边距,编码方式,条码高度,条码内容,斜,间隔因子2 2,打印内容
			TSCObj.ActiveXbarcode(580, 27, 128, 45, 1, 0, 2, 2, data)//x边距,y边距,编码方式,条码高度,条码内容,斜,间隔因子2 2,打印内容
			TSCObj.ActiveXprintlabel("1","1")//(打印份数,每页打印张数)
			TSCObj.ActiveXcloseport()
            window.opener=null;
            window.open("","_self");
            window.close();
         }

   时间有限,闲暇之余,先暂时记录这么多吧,随后再添加项。之后再源码全部分享一下。但愿能给初学者一个参考