• 前端bootstrap+fileInput+django后端是用ajax方式上传form表单数据及多个文件保存到数据库


    前端部分:

    简介:

    一款非常优秀的HTML5文件上传插件,支持bootstrap 3.x

    和4.x版本,具有非常多的特性:多文件选择。这个插件能最简单的帮你完成文件上传功能,且使用bootstrap样式。还支持多种文件的预览,images,
    text, html, video, audio,
    flash。另外还支持ajax方式上传文件,可以看到上传进度。支持拖拽的方式添加和删除文件。

    一、下载bootstrap-fileinput

    下载bootstrap-fileinput

    参数的配置可以参考:https://blog.csdn.net/u012526194/article/details/69937741/
    或者中文官网:http://www.bootstrap-fileinput.com/options.html

    二、创建一个web项目,引入js、css文件

    <script src="{% static 'resource/js/config.js' %}" type="text/javascript">script>
    <script src="{% static 'resource/libs/easyUI/easyui-lang-zh_CN.js' %}" type="text/javascript">script>
    <script src="{% static 'resource/libs/easyUI/jquery.easyui.min.js' %}" type="text/javascript">script>
    <script src="{% static 'resource/libs/fileInput/js/fileinput.js' %}" type="text/javascript">script>
    <script src="{% static 'resource/libs/fileInput/js/locales/zh.js' %}" type="text/javascript">script>
    

    我使用的是django+ boostrap
    ————————————————

    html

    <form id="newChangeRequestForm" method="post" class="container" enctype="multipart/form-data">
    	.........
        <div class="form-group">
            <label class="font-weight-bold">Add attachments:label>
            <input name="uploadFile" type="file" id="uploadFile" multiple class="file-loading"/>
            <span>支持jpg, jpeg, png, gif, pdf, doc, docx, xls, xlsx, ppt, pptx, zip, rar, txt格式,大小不超过50Mspan>
        div>
        <div class="col-6 mb-3 text-right">
            <input
                    class="btn btn-primary"
                    id="SubmitTest"
                    type="button"
                    value=" SubmitTest"
                    onclick="checkSubmitTest()"
            />
        div>
    form>
    

    js

    var fileList = []
    var isFirstSelect = true
    
    $(function () {
        //初始化fileinput
        var fileInput = new FileInput();
        fileInput.Init("uploadFileId", '');
    });
    
    //初始化fileinput
    var FileInput = function () {
        var oFile = new Object();
    
        //初始化fileinput控件(第一次初始化)
        oFile.Init = function (ctrlName, uploadUrl) {
            var control = $('#' + ctrlName);
    
            //初始化上传控件的样式
            control.fileinput({
                layoutTemplates: {
                    // footer:'',//隐藏全部小图标;
                    // actionUpload: '',//去除上传预览缩略图中的上传图片;
                    indicator: '', //去除上传状态图标(左侧➕)
                    actionDrag: '',//去除拖动图标(通常编辑的时候会显示这个图标)
                    actionDelete:'',//去除删除图标
                    //其他 参考fileinput.js/fileinput.min.js中 搜索 layoutTemplates,可以看到模板内所有元素  需要改哪个,直接在这里赋空字符串就行了
                },
                language: 'zh', //设置语言
                theme: "fa",
                uploadUrl: uploadUrl, //上传的地址
                allowedFileExtensions: ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx',
                                        'zip', 'rar', 'txt', 'bmp', 'html'], //接收的文件后缀
                uploadAsync: true, //默认异步上传
    
                showUpload: false, //是否显示上传按钮
                showRemove: true, //显示移除按钮
                showCaption: true, //是否显示标题
    
                dropZoneEnabled: true, //是否显示拖拽区域
                initialPreviewAsData: true,
    
                maxFileSize: 1024 * 50,//单位为kb,如果为0表示不限制文件大小,10M
                //minFileCount: 0,
                maxFileCount: 10, //表示允许同时上传的最大文件个数
                // maxFilesNum: 3, //表示允许同时上传的最大文件个数
                msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
                enctype: 'multipart/form-data',
                overwriteInitial: false,
                autoReplace: true, //自动替换
    
                browseClass: "btn btn-primary", //按钮样式: btn-default、btn-primary、btn-danger、btn-info、btn-warning
                previewFileIcon: "",
    
            }).on('filebatchselected', function (evt, file) {
                if (isFirstSelect) {
                    isFirstSelect = false
                    $.messager.alert("提示", '目前文件只支持一次性选择,再次选择文件将会覆盖原来的文件!', "warning")
                }
            });
            //文件上传完成之后发生的事件
            $("#uploadFileId").on("fileuploaded", function (event, data, previewId, index) {
                console.log(data)
                console.log(data.response.msg)
                var msg = data.response.msg
                $.messager.alert("提示", msg, "warning");
            });
        }
        return oFile;	//这里必须返回oFile对象,否则FileInput组件初始化不成功
    };
    
    
    function SubmitChangeRequestForm() {
    	var formData = new FormData($("#newChangeRequestForm")[0]);
    	// $("#uploadFileId").fileinput("upload");  // 单独上传文件接口
        submitForm(formData);
    }
    
    function submitForm(formData) {
        // var form = document.forms[0];
        console.log(formData)
        // var jsonData = JSON.stringify(formData);
        $.ajax({
            url: server_url + '/new_change_request/',
            method: 'POST',
            data: formData,
            dataType: "json",
            processData: false,
            contentType: false,
            cache: false,
            success: function (data) {
                console.log("data:" + data);
                console.log("data:" + data.res);
                if (data.status === 200) {
                    $.messager.alert("提示", data.msg, "info");
                    console.log("data:" + data.msg);
                    // window.setTimeout("window.location=server_url+'/new_change_request'", 1500);
                    // window.setTimeout("window.location=server_url+'/cp_index'", 1500);
                    return;
                }
                console.log(data)
                $.messager.alert("提示", data.msg, "info");
            },
            //请求失败,包含具体的错误信息
            error: function (data) {
                console.log(data.msg);
            }
        });
    
    }
    
    

    Django后端部分

    models

    from django.db import models
    
    
    class BaseModel(models.Model):
        """为模型类补充字段"""
    
        create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
        update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
        created_date = models.DateField(verbose_name="创建日期", auto_now_add=True)
    
        class Meta:
            abstract = True  # 说明是抽象模型类, 用于继承使用,数据库迁移时不会创建BaseModel的表
            
    class File(BaseModel):
        def generate_filename(self, filename):
            url = "files/{}".format(filename)
            return url
    
        file = models.FileField(upload_to=generate_filename)
        filename = models.CharField(verbose_name="文件名称", max_length=128, blank=True, null=True)
        suffix = models.CharField(max_length=20, verbose_name='后缀', blank=True, null=True)
        is_deleted = models.BooleanField(default=False)
    
        content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)
        object_id = models.PositiveIntegerField(blank=True, null=True)
        content_object = GenericForeignKey('content_type', 'object_id')
    
        class Meta:
            verbose_name = '文件'
    
        def __str__(self):
            return self.filename
    

    views视图

    class NewChangeRequest(LoginRequiredJSONMixin, View):
        @transaction.atomic
        def post(self, request):
            print(request.FILES)
            print(request.POST)
            print(request.POST.get('title'))
            files_obj = request.FILES.getlist('uploadFile')
            print(type(files_obj), files_obj)
            for file in files_obj:
                filename = file.name
                suffix = filename.rsplit(".", 1)[1]
                file = File(file=file, filename=filename, suffix=suffix)
                file.save()
            data = {"data":'data!', 'msg':'文件保存成功!', 'status': 200}
            return JsonResponse(data)
    

    这里主要介绍文件保存的方法,form表单数据存入同理,有时间会在更新一篇

  • 相关阅读:
    Netty之I/O模型
    【LeetCode 1758】生成交替二进制字符串的最少操作数
    Compose预处理组件大比拼:性能、应用场景和可视化对比总结
    mysql笔记
    Java学习笔记——集合
    Document:visibilitychange 事件
    JNI开发必学C/C++使用实践
    Gif格式图片怎么制作?超简单的方法分享
    InetAddress.getLocalHost() 执行很慢?
    03-Django-基础篇-创建项目
  • 原文地址:https://blog.csdn.net/qq_43030934/article/details/126949901