momo8238

 

一.

<input type="file" id="fafafa" name="afafaf"/>  <input type="file"> 这个标签是改不了的,只能通过其他方式,对它进行修饰。

 

因为input 框太难看了,又无法设置样式。

可以把它设置成在最上面,并且透明度等于0,把我们写的样式放到下面。

此图是抽屉网址中的好看的上传按钮。

二. 程序粘贴

input 标签应该放在最上面。a标签应该在最下面。让input的透明度为0,这样就可以看到a标签了。

views.py

def upload(request):
    return render(request,\'upload.html\')

 upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .upload{
            display:inline-block;
            padding:10px;
            background-color:brown;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:90;
        }
        .file{
            width:100px;height:50px;opacity:0;
            display:inline-block;
            padding:10px;
            background-color:brown;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:100;
        }
    </style>
</head>
<body>
    <div style="position:relative;width:100px;height:50px;">
        <input class="file" type="file" id="fafafa" name="afafafa"/>
        <a class="upload">上传</a>
    </div>
</body>
</html>

 最终的效果:

点击上传按钮的时候,就可以选择文件了。

 

三. 选择文件后提交,提交前首先得获取input值。

 

3.1 用原生的Ajax实现文件上传。 要依赖FormData对象。基于原生Ajax可以实现文件上传,不过要借助于 FormData 这个对象。

程序粘贴:

views.py

  1 # 基于ModelForm方式来实现
  2 from django.shortcuts import render,HttpResponse
  3 from app01 import models
  4 from django import forms
  5 from django.forms import fields as Ffields
  6 from django.forms import widgets as Fwidgets
  7 def orm(request):
  8     #models.UserGroup.objects.create(name=\'CEO\')
  9     #models.UserGroup.objects.create(name=\'CFO\')
 10     #models.UserGroup.objects.create(name=\'COO\')
 11     return HttpResponse(\'orm\')
 12 
 13 class UserInfoModelForm(forms.ModelForm):
 14     #自定义额外的字段,比如是否要保存一个月内免登陆。
 15     is_remember=Ffields.CharField(
 16         widget=Fwidgets.CheckboxInput()
 17     )
 18     class Meta:
 19         model=models.UserInfo  #指去哪个类里面去获取字段,以后也可以做增删改查。
 20         fields=\'__all__\'       #代指的是所有的field字段
 21         #fields=[\'username\']   #还可以是一个列表,可以选择要展示哪几列,只展示username这一列
 22         #exclude=[\'username\']   #把username列排除在外了。
 23         #labels={\'username\':\'请填入用户名\'}
 24         #help_texts={\'username\':\'请把你的名字写对\'}
 25         #widgets={\'username\':Fwidgets.Textarea(attrs={\'class\':\'c1\'})}
 26         error_messages={
 27             \'__all__\':{},
 28             \'email\':{
 29                 \'required\':\'邮箱不能为空\',
 30                 \'invalid\':\'邮箱格式错误\',
 31             }
 32         }
 33         #field_classes={\'email\':Ffields.URLField}
 34     def clean_username(self):
 35         old=self.cleaned_data[\'username\']
 36         return old
 37 
 38 class UserInfoForm(forms.Form):
 39     username = Ffields.CharField(max_length=32)
 40     email=Ffields.EmailField()
 41     #user_type=fields.ForeignKey(to=\'UserType\',to_field=\'id\')
 42     user_type=Ffields.ChoiceField(
 43         choices=models.UserType.objects.values_list(\'id\',\'caption\')
 44     )
 45 
 46     def __init__(self,*args,**kwargs):
 47         super(UserInfoForm,self).__init__(*args,**kwargs)
 48         self.fields[\'user_type\'].choices=models.UserType.objects.values_list(\'id\',\'caption\')
 49 
 50 def index(request):
 51     if request.method==\'GET\':
 52         obj=UserInfoModelForm()
 53         return render(request,\'index.html\',{\'obj\':obj})
 54     elif request.method==\'POST\':
 55         obj=UserInfoModelForm(request.POST)
 56         if obj.is_valid():
 57             #obj.save()#这个save实现的时候,其实内部包含了2个步骤。可以拆开。
 58             instance=obj.save(False) #什么也没干
 59             instance.save() #只会保存当前这个类,而不会保存manytomany
 60             obj.save_m2m() #保存manytomany
 61         #print(obj.is_valid())
 62         #print(obj.cleaned_data)
 63         #print(obj.errors.as_json())
 64         return render(request, \'index.html\', {\'obj\': obj})
 65 
 66 def user_list(request):
 67     li=models.UserInfo.objects.all().select_related(\'user_type\') #先把userinfo中的数据取出来
 68     return render(request,\'user_list.html\',{\'li\':li})
 69 
 70 def user_edit(request,nid):
 71     #获取当前id对应的用户信息
 72     #显示用户已经存在的数据
 73     if request.method==\'GET\':
 74         user_obj=models.UserInfo.objects.filter(id=nid).first() #获取对象
 75         mf=UserInfoModelForm(instance=user_obj) #帮咱们生成标签
 76         return render(request, \'user_edit.html\',{\'mf\':mf,\'nid\':nid})
 77     elif request.method==\'POST\':
 78         user_obj = models.UserInfo.objects.filter(id=nid).first() #获取对象
 79         mf = UserInfoModelForm(request.POST,instance=user_obj) #instance传进来表示更新,不加的话表示新建了一条数据。
 80         if mf.is_valid():
 81             mf.save()
 82         else:
 83             print(mf.errors.as_json())
 84         return render(request, \'user_edit.html\', {\'mf\': mf, \'nid\': nid})
 85 
 86 def ajax(request):
 87     return render(request,\'ajax.html\')
 88 
 89 def ajax_json(request):
 90     import time
 91     time.sleep(3)
 92     print(request.POST)
 93     ret={\'code\':True,\'data\':request.POST.get(\'username\')} #字典
 94     import json
 95     return HttpResponse(json.dumps(ret),status=404,reason=\'Not Found\')
 96 
 97 def upload(request):
 98     return render(request,\'upload.html\')
 99 
100 def upload_file(request):
101     print(request.method)
102     username=request.POST.get(\'username\')
103     fafafa=request.FILES.get(\'fafafa\')
104     print(username,fafafa)
105     with open(fafafa.name,\'wb\') as f:
106         for item in fafafa.chunks():
107             f.write(item)
108 
109     ret={\'code\':True,\'data\':request.POST.get(\'username\')} #字典
110     import json
111     return HttpResponse(json.dumps(ret))


 

 upload.html

var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象;如果是文本的话,可以用.value 或 .val

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <style>
 7         .upload{
 8             display:inline-block;
 9             padding:10px;
10             background-color:brown;
11             position:absolute;
12             top:0;
13             bottom:0;
14             right:0;
15             left:0;
16             z-index:90;
17         }
18         .file{
19             width:100px;height:50px;opacity:0;
20             position:absolute;
21             top:0;
22             bottom:0;
23             right:0;
24             left:0;
25             z-index:100;
26         }
27     </style>
28 </head>
29 <body>
30     <div style="position:relative;width:100px;height:50px;">
31         <input class="file" type="file" id="fafafa" name="afafaf"/>
32         <a class="upload">上传</a>
33     </div>
34     <input type="button" value="提交XHR" onclick="xhrSubmit();"/>
35     <script>
36         function xhrSubmit(){
37             //$(\'#fafafa\')[0]
38             var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
39             var fd=new FormData();
40             fd.append(\'username\',\'root\'); 这里是字符串,上面是文件,没法直接发过去,所以需要引入一个新的FormData对象。
41             fd.append(\'fafafa\',file_obj); 加普通值可以,加对象也可以。
42 
43             var xhr=new XMLHttpRequest(); //为了兼容IE旧版本
44             xhr.open(\'POST\',\'/upload_file/\',true); //指定用什么形式发,发到哪里,是否异步(是)
45             xhr.onreadystatechange=function(){
46                 if(xhr.readyState==4){
47                     //接收完毕,放到XMLHttprequest对象里面了
48                     var obj=JSON.parse(xhr.responseText);
49                     console.log(obj); //这就是我们要拿的返回值
50                 }
51             };
52             xhr.send(fd); //发送的数据,字符串
53         }
54     </script>
55 </body>
56 </html>


 

Ajax.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8     <input type="text"/>
 9     <input type="button" value="Ajax1" onclick="Ajax1();"/>
10 
11     <!--
12     <input type="text" id="url"/>
13     <input type="button" value="发送iframe请求" onclick="iframeRequest();"/>
14     <iframe id="ifm" src="http://www.baidu.com"></iframe>
15     -->
16 
17     <form action="/ajax_json/" method="POST" target="ifm1">
18         <iframe id="ifm1" name="ifm1"></iframe>
19         <input type="text" name="username"/>
20         <input type="text" name="email"/>
21         <input type="submit" onclick="submitForm();" value="Form提交"/>
22     </form>
23 
24     <script type="text/javascript" src="/static/jquery-1.12.4.js"></script>
25     <script>
26         function getXHR(){
27             var xhr = null;
28             if(XMLHttpRequest){
29                 xhr = new XMLHttpRequest();
30             }else{
31                 xhr = new ActiveXObject("Microsoft.XMLHTTP");
32             }
33             return xhr;
34 
35         }
36 
37         function Ajax1(){
38             //var xhr=new XMLHttpRequest(); //创建XMLHttpRequest对象
39             var xhr=getXHR(); //为了兼容IE旧版本
40             xhr.open(\'POST\',\'/ajax_json/\',true); //指定用什么形式发,发到哪里,是否异步(是)
41             xhr.onreadystatechange=function(){
42                 if(xhr.readyState==4){
43                     //接收完毕,放到XMLHttprequest对象里面了
44                     var obj=JSON.parse(xhr.responseText);
45                     console.log(obj); //这就是我们要拿的返回值
46                 }
47             };
48             xhr.setRequestHeader(\'k1\',\'v1\'); //发送的时候带着请求头,csrf的时候用。
49             xhr.setRequestHeader(\'Content-Type\', \'application/x-www-form-urlencoded; charset-UTF-8\');
50             //设置请求头,判断发来的请求头里面,怎么样把数据打包的。这样后台就知道怎么样去解了。
51             xhr.send("name=root;pwd=123"); //发送的数据
52         }
53 
54        /*
55        function iframeRequest(){
56             var url=$(\'#url\').val();
57             $(\'#ifm\').attr(\'src\',url);
58        }
59        */
60 
61         function submitForm(){
62             $(\'#ifm1\').load(function(){
63                 var text=$(\'#ifm1\').contents().find(\'body\').text();
64                 var obj=JSON.parse(text);
65             })
66         }
67 
68     </script>
69 </body>
70 </html>


 urls.py

 1 from django.conf.urls import url
 2 from django.contrib import admin
 3 from app01 import views
 4 
 5 urlpatterns = [
 6     url(r\'^admin/\', admin.site.urls),
 7     url(r\'^index/\', views.index),
 8     url(r\'^user_list/\', views.user_list),
 9     url(r\'^edit-(\d+)/\', views.user_edit),
10     url(r\'^ajax/$\', views.ajax),
11     url(r\'^ajax_json/$\', views.ajax_json),
12     url(r\'^orm/\', views.orm),
13     url(r\'^upload/\', views.upload),
14     url(r\'^upload_file/\', views.upload_file),
15 ]

 

页面效果:

 

 

 

 

3.2,基于jQuery来实现文件上传。

 以下这两句是告诉jquery,不用对我的数据做特殊的处理。

processData:false,// tell jQuery not to process the data 
contentType:false,// tell jQuery not to set contentType

程序粘贴:



upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .upload{
            display:inline-block;
            padding:10px;
            background-color:brown;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:90;
        }
        .file{
            width:100px;height:50px;opacity:0;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:100;
        }
    </style>
</head>
<body>
    <div style="position:relative;width:100px;height:50px;">
        <input class="file" type="file" id="fafafa" name="afafaf"/>
        <a class="upload">上传</a>
    </div>
    <input type="button" value="提交XHR" onclick="xhrSubmit();"/>
    <input type="button" value="提交jQuery" onclick="jqSubmit();"/>

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        function jqSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);
            $.ajax({
                url:/upload_file/,
                type:\'POST\',
                data:fd,
                processData:false,// tell jQuery not to process the data
                contentType:false,// tell jQuery not to set contentType
                success:function(arg,a1,a2){
                    console.log(arg);
                    console.log(a1);
                    console.log(a2);
                }

            })
        }

        function xhrSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);

            var xhr=new XMLHttpRequest(); //为了兼容IE旧版本
            xhr.open(\'POST\',\'/upload_file/\',true); //指定用什么形式发,发到哪里,是否异步(是)
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    //接收完毕,放到XMLHttprequest对象里面了
                    var obj=JSON.parse(xhr.responseText);
                    console.log(obj); //这就是我们要拿的返回值
                }
            };
            xhr.send(fd); //发送的数据,字符串
        }
    </script>
</body>
</html>

 页面效果:

3.3,用原生的Ajax和jQuery都实现了文件的上传,但是这两者都依赖于FormData (低版本的又不支持)

需要用iframe的方式提交(兼容所有的浏览器,最主要是兼容IE)。发数据有3种方式,上传文件也应该有3种方式。

程序粘贴:

views.py

# 基于ModelForm方式来实现
from django.shortcuts import render,HttpResponse
from app01 import models
from django import forms
from django.forms import fields as Ffields
from django.forms import widgets as Fwidgets
def orm(request):
    #models.UserGroup.objects.create(name=\'CEO\')
    #models.UserGroup.objects.create(name=\'CFO\')
    #models.UserGroup.objects.create(name=\'COO\')
    return HttpResponse(\'orm\')

class UserInfoModelForm(forms.ModelForm):
    #自定义额外的字段,比如是否要保存一个月内免登陆。
    is_remember=Ffields.CharField(
        widget=Fwidgets.CheckboxInput()
    )
    class Meta:
        model=models.UserInfo  #指去哪个类里面去获取字段,以后也可以做增删改查。
        fields=\'__all__\'       #代指的是所有的field字段
        #fields=[\'username\']   #还可以是一个列表,可以选择要展示哪几列,只展示username这一列
        #exclude=[\'username\']   #把username列排除在外了。
        #labels={\'username\':\'请填入用户名\'}
        #help_texts={\'username\':\'请把你的名字写对\'}
        #widgets={\'username\':Fwidgets.Textarea(attrs={\'class\':\'c1\'})}
        error_messages={
            \'__all__\':{},
            \'email\':{
                \'required\':\'邮箱不能为空\',
                \'invalid\':\'邮箱格式错误\',
            }
        }
        #field_classes={\'email\':Ffields.URLField}
    def clean_username(self):
        old=self.cleaned_data[\'username\']
        return old

class UserInfoForm(forms.Form):
    username = Ffields.CharField(max_length=32)
    email=Ffields.EmailField()
    #user_type=fields.ForeignKey(to=\'UserType\',to_field=\'id\')
    user_type=Ffields.ChoiceField(
        choices=models.UserType.objects.values_list(\'id\',\'caption\')
    )

    def __init__(self,*args,**kwargs):
        super(UserInfoForm,self).__init__(*args,**kwargs)
        self.fields[\'user_type\'].choices=models.UserType.objects.values_list(\'id\',\'caption\')

def index(request):
    if request.method==\'GET\':
        obj=UserInfoModelForm()
        return render(request,\'index.html\',{\'obj\':obj})
    elif request.method==\'POST\':
        obj=UserInfoModelForm(request.POST)
        if obj.is_valid():
            #obj.save()#这个save实现的时候,其实内部包含了2个步骤。可以拆开。
            instance=obj.save(False) #什么也没干
            instance.save() #只会保存当前这个类,而不会保存manytomany
            obj.save_m2m() #保存manytomany
        #print(obj.is_valid())
        #print(obj.cleaned_data)
        #print(obj.errors.as_json())
        return render(request, \'index.html\', {\'obj\': obj})

def user_list(request):
    li=models.UserInfo.objects.all().select_related(\'user_type\') #先把userinfo中的数据取出来
    return render(request,\'user_list.html\',{\'li\':li})

def user_edit(request,nid):
    #获取当前id对应的用户信息
    #显示用户已经存在的数据
    if request.method==\'GET\':
        user_obj=models.UserInfo.objects.filter(id=nid).first() #获取对象
        mf=UserInfoModelForm(instance=user_obj) #帮咱们生成标签
        return render(request, \'user_edit.html\',{\'mf\':mf,\'nid\':nid})
    elif request.method==\'POST\':
        user_obj = models.UserInfo.objects.filter(id=nid).first() #获取对象
        mf = UserInfoModelForm(request.POST,instance=user_obj) #instance传进来表示更新,不加的话表示新建了一条数据。
        if mf.is_valid():
            mf.save()
        else:
            print(mf.errors.as_json())
        return render(request, \'user_edit.html\', {\'mf\': mf, \'nid\': nid})

def ajax(request):
    return render(request,\'ajax.html\')

def ajax_json(request):
    import time
    time.sleep(3)
    print(request.POST)
    ret={\'code\':True,\'data\':request.POST.get(\'username\')} #字典
    import json
    return HttpResponse(json.dumps(ret),status=404,reason=\'Not Found\')

def upload(request):
    return render(request,\'upload.html\')

def upload_file(request):
    print(request.method)
    username=request.POST.get(\'username\')
    fafafa=request.FILES.get(\'fafafa\')
    print(username,fafafa)
    with open(fafafa.name,\'wb\') as f:
        for item in fafafa.chunks():
            f.write(item)

    ret={\'code\':True,\'data\':request.POST.get(\'username\')} #字典
    import json
    return HttpResponse(json.dumps(ret))

 ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text"/>
    <input type="button" value="Ajax1" onclick="Ajax1();"/>

    <!--
    <input type="text" id="url"/>
    <input type="button" value="发送iframe请求" onclick="iframeRequest();"/>
    <iframe id="ifm" src="http://www.baidu.com"></iframe>
    -->

    <form action="/ajax_json/" method="POST" target="ifm1">
        <iframe id="ifm1" name="ifm1"></iframe>
        <input type="text" name="username"/>
        <input type="text" name="email"/>
        <input type="submit" onclick="submitForm();" value="Form提交"/>
    </form>

    <script type="text/javascript" src="/static/jquery-1.12.4.js"></script>
    <script>
        function getXHR(){
            var xhr = null;
            if(XMLHttpRequest){
                xhr = new XMLHttpRequest();
            }else{
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            return xhr;

        }

        function Ajax1(){
            //var xhr=new XMLHttpRequest(); //创建XMLHttpRequest对象
            var xhr=getXHR(); //为了兼容IE旧版本
            xhr.open(\'POST\',\'/ajax_json/\',true); //指定用什么形式发,发到哪里,是否异步(是)
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    //接收完毕,放到XMLHttprequest对象里面了
                    var obj=JSON.parse(xhr.responseText);
                    console.log(obj); //这就是我们要拿的返回值
                }
            };
            xhr.setRequestHeader(\'k1\',\'v1\'); //发送的时候带着请求头,csrf的时候用。
            xhr.setRequestHeader(\'Content-Type\', \'application/x-www-form-urlencoded; charset-UTF-8\');
            //设置请求头,判断发来的请求头里面,怎么样把数据打包的。这样后台就知道怎么样去解了。
            xhr.send("name=root;pwd=123"); //发送的数据
        }

       /*
       function iframeRequest(){
            var url=$(\'#url\').val();
            $(\'#ifm\').attr(\'src\',url);
       }
       */

        function submitForm(){
            $(\'#ifm1\').load(function(){
                var text=$(\'#ifm1\').contents().find(\'body\').text();
                var obj=JSON.parse(text);
            })
        }

    </script>
</body>
</html>

 upload.html

 

<iframe id="ifm1" name="ifm1" style="display:none;"></iframe> 不让用户看到iframe框。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .upload{
            display:inline-block;
            padding:10px;
            background-color:brown;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:90;
        }
        .file{
            width:100px;height:50px;opacity:0;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:100;
        }
    </style>
</head>
<body>
    <div style="position:relative;width:100px;height:50px;">
        <input class="file" type="file" id="fafafa" name="afafaf"/>
        <a class="upload">上传</a>
    </div>
    <input type="button" value="提交XHR" onclick="xhrSubmit();"/>
    <input type="button" value="提交jQuery" onclick="jqSubmit();"/>

    <hr/>
    <form action="/upload_file/" method="POST" enctype="multipart/form-data" target="ifm1">
        <iframe id="ifm1" name="ifm1" style="display:none;"></iframe>
        <input type="file" name="fafafa"/>
        <input type="submit" onclick="iframeSubmit();" value="Form提交"/>
    </form>

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        function jqSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);
            $.ajax({
                url:/upload_file/,
                type:\'POST\',
                data:fd,
                processData:false,// tell jQuery not to process the data
                contentType:false,// tell jQuery not to set contentType
                success:function(arg,a1,a2){
                    console.log(arg);
                    console.log(a1);
                    console.log(a2);
                }
            })
        }

        function xhrSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);

            var xhr=new XMLHttpRequest(); //为了兼容IE旧版本
            xhr.open(\'POST\',\'/upload_file/\',true); //指定用什么形式发,发到哪里,是否异步(是)
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    //接收完毕,放到XMLHttprequest对象里面了
                    var obj=JSON.parse(xhr.responseText);
                    console.log(obj); //这就是我们要拿的返回值
                }
            };
            xhr.send(fd); //发送的数据,字符串
        }

        function iframeSubmit(){
            $(\'#ifm1\').load(function(){
                var text=$(\'#ifm1\').contents().find(\'body\').text();
                var obj=JSON.parse(text);
                console.log(obj);
            })
        }
    </script>
</body>
</html>

 urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^index/\', views.index),
    url(r\'^user_list/\', views.user_list),
    url(r\'^edit-(\d+)/\', views.user_edit),
    url(r\'^ajax/$\', views.ajax),
    url(r\'^ajax_json/$\', views.ajax_json),
    url(r\'^orm/\', views.orm),
    url(r\'^upload/\', views.upload),
    url(r\'^upload_file/\', views.upload_file),
]

 经测验,也可以成功上传。

 

四,时机选择

如果往后台发送的是普通数据-->jQuery, XMLHttpRequest, iframe

如果往后台发送的是文件--->iframe(不做任何依赖), jQuery(依赖于FormData), XMLHttpRequest(依赖于FormData)。

 

五,如果上传的是图片,则需要有预览功能

把图片上传到static/imgs文件夹下,

img_path=os.path.join(\'static/imgs\',fafafa.name)  让imgs路径与fafafa.name路径做个拼接。

ret = {\'code\': True, \'data\':img_path}  data返回的时候直接把路径返回。

上传成功的图片可以通过静态文件(路径)访问一下。可以在页面上添加一个“div”标签, class=preview,绑定到Form提交上,让img的src指向这个静态路径。

 

 

views.py

def upload(request):
    return render(request,\'upload.html\')

def upload_file(request):
    print(request.method)
    username=request.POST.get(\'username\')
    fafafa=request.FILES.get(\'fafafa\')
    import os
    img_path=os.path.join(\'static/imgs\',fafafa.name)
    with open(img_path,\'wb\') as f:
        for item in fafafa.chunks():
            f.write(item)
    ret = {\'code\': True, \'data\':img_path}
    #ret={\'code\':True,\'data\':request.POST.get(\'username\')} #字典
    import json
    return HttpResponse(json.dumps(ret))

 页面效果:

 

 

 

然后通过静态文件访问一下图片所在的URL

 

 

在页面上添加一个image标签,src=刚才图片所在路径就可以了。

$(\'#preview\').empty();  如果原来有,则先清空一下。


粘贴程序:

 

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .upload{
            display:inline-block;
            padding:10px;
            background-color:brown;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:90;
        }
        .file{
            width:100px;height:50px;opacity:0;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:100;
        }
    </style>
</head>
<body>
    <div style="position:relative;width:100px;height:50px;">
        <input class="file" type="file" id="fafafa" name="afafaf"/>
        <a class="upload">上传</a>
    </div>
    <input type="button" value="提交XHR" onclick="xhrSubmit();"/>
    <input type="button" value="提交jQuery" onclick="jqSubmit();"/>

    <hr/>
    <form action="/upload_file/" method="POST" enctype="multipart/form-data" target="ifm1">
        <iframe id="ifm1" name="ifm1" style="display:none;"></iframe>
        <input type="file" name="fafafa"/>
        <input type="submit" onclick="iframeSubmit();" value="Form提交"/>
    </form>

    <div id="preview"></div>

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        function jqSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);
            $.ajax({
                url:/upload_file/,
                type:\'POST\',
                data:fd,
                processData:false,// tell jQuery not to process the data
                contentType:false,// tell jQuery not to set contentType
                success:function(arg,a1,a2){
                    console.log(arg);
                    console.log(a1);
                    console.log(a2);
                }
            })
        }

        function xhrSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);

            var xhr=new XMLHttpRequest(); //为了兼容IE旧版本
            xhr.open(\'POST\',\'/upload_file/\',true); //指定用什么形式发,发到哪里,是否异步(是)
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    //接收完毕,放到XMLHttprequest对象里面了
                    var obj=JSON.parse(xhr.responseText);
                    console.log(obj); //这就是我们要拿的返回值
                }
            };
            xhr.send(fd); //发送的数据,字符串
        }

        function iframeSubmit(){
            $(\'#ifm1\').load(function(){
                var text=$(\'#ifm1\').contents().find(\'body\').text();
                var obj=JSON.parse(text);

                $(\'#preview\').empty();
                var imgTag=document.createElement(\'img\');
                imgTag.src="/"+obj.data;
                $(\'#preview\').append(imgTag);
            })
        }
    </script>
</body>
</html>

 

页面效果:

 

如果不想预览,想直接提交也是可以的。(选中文件以后就可以预览了,然后下一步再点击提交)

给input标签绑定一个onchange事件。用JS方法来提交。$(\'#form1\').submit()

 

程序粘贴:

views.py

# 基于ModelForm方式来实现
from django.shortcuts import render,HttpResponse
from app01 import models
from django import forms
from django.forms import fields as Ffields
from django.forms import widgets as Fwidgets
def orm(request):
    #models.UserGroup.objects.create(name=\'CEO\')
    #models.UserGroup.objects.create(name=\'CFO\')
    #models.UserGroup.objects.create(name=\'COO\')
    return HttpResponse(\'orm\')

class UserInfoModelForm(forms.ModelForm):
    #自定义额外的字段,比如是否要保存一个月内免登陆。
    is_remember=Ffields.CharField(
        widget=Fwidgets.CheckboxInput()
    )
    class Meta:
        model=models.UserInfo  #指去哪个类里面去获取字段,以后也可以做增删改查。
        fields=\'__all__\'       #代指的是所有的field字段
        #fields=[\'username\']   #还可以是一个列表,可以选择要展示哪几列,只展示username这一列
        #exclude=[\'username\']   #把username列排除在外了。
        #labels={\'username\':\'请填入用户名\'}
        #help_texts={\'username\':\'请把你的名字写对\'}
        #widgets={\'username\':Fwidgets.Textarea(attrs={\'class\':\'c1\'})}
        error_messages={
            \'__all__\':{},
            \'email\':{
                \'required\':\'邮箱不能为空\',
                \'invalid\':\'邮箱格式错误\',
            }
        }
        #field_classes={\'email\':Ffields.URLField}
    def clean_username(self):
        old=self.cleaned_data[\'username\']
        return old

class UserInfoForm(forms.Form):
    username = Ffields.CharField(max_length=32)
    email=Ffields.EmailField()
    #user_type=fields.ForeignKey(to=\'UserType\',to_field=\'id\')
    user_type=Ffields.ChoiceField(
        choices=models.UserType.objects.values_list(\'id\',\'caption\')
    )

    def __init__(self,*args,**kwargs):
        super(UserInfoForm,self).__init__(*args,**kwargs)
        self.fields[\'user_type\'].choices=models.UserType.objects.values_list(\'id\',\'caption\')

def index(request):
    if request.method==\'GET\':
        obj=UserInfoModelForm()
        return render(request,\'index.html\',{\'obj\':obj})
    elif request.method==\'POST\':
        obj=UserInfoModelForm(request.POST)
        if obj.is_valid():
            #obj.save()#这个save实现的时候,其实内部包含了2个步骤。可以拆开。
            instance=obj.save(False) #什么也没干
            instance.save() #只会保存当前这个类,而不会保存manytomany
            obj.save_m2m() #保存manytomany
        #print(obj.is_valid())
        #print(obj.cleaned_data)
        #print(obj.errors.as_json())
        return render(request, \'index.html\', {\'obj\': obj})

def user_list(request):
    li=models.UserInfo.objects.all().select_related(\'user_type\') #先把userinfo中的数据取出来
    return render(request,\'user_list.html\',{\'li\':li})

def user_edit(request,nid):
    #获取当前id对应的用户信息
    #显示用户已经存在的数据
    if request.method==\'GET\':
        user_obj=models.UserInfo.objects.filter(id=nid).first() #获取对象
        mf=UserInfoModelForm(instance=user_obj) #帮咱们生成标签
        return render(request, \'user_edit.html\',{\'mf\':mf,\'nid\':nid})
    elif request.method==\'POST\':
        user_obj = models.UserInfo.objects.filter(id=nid).first() #获取对象
        mf = UserInfoModelForm(request.POST,instance=user_obj) #instance传进来表示更新,不加的话表示新建了一条数据。
        if mf.is_valid():
            mf.save()
        else:
            print(mf.errors.as_json())
        return render(request, \'user_edit.html\', {\'mf\': mf, \'nid\': nid})

def ajax(request):
    return render(request,\'ajax.html\')

def ajax_json(request):
    import time
    time.sleep(3)
    print(request.POST)
    ret={\'code\':True,\'data\':request.POST.get(\'username\')} #字典
    import json
    return HttpResponse(json.dumps(ret),status=404,reason=\'Not Found\')

def upload(request):
    return render(request,\'upload.html\')

def upload_file(request):
    print(request.method)
    username=request.POST.get(\'username\')
    fafafa=request.FILES.get(\'fafafa\')
    import os
    img_path=os.path.join(\'static/imgs\',fafafa.name)
    with open(img_path,\'wb\') as f:
        for item in fafafa.chunks():
            f.write(item)
    ret = {\'code\': True, \'data\':img_path}
    #ret={\'code\':True,\'data\':request.POST.get(\'username\')} #字典
    import json
    return HttpResponse(json.dumps(ret))

 Ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text"/>
    <input type="button" value="Ajax1" onclick="Ajax1();"/>

    <!--
    <input type="text" id="url"/>
    <input type="button" value="发送iframe请求" onclick="iframeRequest();"/>
    <iframe id="ifm" src="http://www.baidu.com"></iframe>
    -->

    <form action="/ajax_json/" method="POST" target="ifm1">
        <iframe id="ifm1" name="ifm1"></iframe>
        <input type="text" name="username"/>
        <input type="text" name="email"/>
        <input type="submit" onclick="submitForm();" value="Form提交"/>
    </form>

    <script type="text/javascript" src="/static/jquery-1.12.4.js"></script>
    <script>
        function getXHR(){
            var xhr = null;
            if(XMLHttpRequest){
                xhr = new XMLHttpRequest();
            }else{
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            return xhr;

        }

        function Ajax1(){
            //var xhr=new XMLHttpRequest(); //创建XMLHttpRequest对象
            var xhr=getXHR(); //为了兼容IE旧版本
            xhr.open(\'POST\',\'/ajax_json/\',true); //指定用什么形式发,发到哪里,是否异步(是)
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    //接收完毕,放到XMLHttprequest对象里面了
                    var obj=JSON.parse(xhr.responseText);
                    console.log(obj); //这就是我们要拿的返回值
                }
            };
            xhr.setRequestHeader(\'k1\',\'v1\'); //发送的时候带着请求头,csrf的时候用。
            xhr.setRequestHeader(\'Content-Type\', \'application/x-www-form-urlencoded; charset-UTF-8\');
            //设置请求头,判断发来的请求头里面,怎么样把数据打包的。这样后台就知道怎么样去解了。
            xhr.send("name=root;pwd=123"); //发送的数据
        }

       /*
       function iframeRequest(){
            var url=$(\'#url\').val();
            $(\'#ifm\').attr(\'src\',url);
       }
       */

        function submitForm(){
            $(\'#ifm1\').load(function(){
                var text=$(\'#ifm1\').contents().find(\'body\').text();
                var obj=JSON.parse(text);
            })
        }

    </script>
</body>
</html>

 

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .upload{
            display:inline-block;
            padding:10px;
            background-color:brown;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:90;
        }
        .file{
            width:100px;height:50px;opacity:0;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            z-index:100;
        }
    </style>
</head>
<body>
    <div style="position:relative;width:100px;height:50px;">
        <input class="file" type="file" id="fafafa" name="afafaf"/>
        <a class="upload">上传</a>
    </div>
    <input type="button" value="提交XHR" onclick="xhrSubmit();"/>
    <input type="button" value="提交jQuery" onclick="jqSubmit();"/>

    <hr/>
    <form id="fm1" action="/upload_file/" method="POST" enctype="multipart/form-data" target="ifm1">
        <iframe id="ifm1" name="ifm1" style="display:none;"></iframe>
        <input type="file" name="fafafa" onchange="changeUpload();"/>
        <input type="submit" onclick="iframeSubmit();" value="Form提交"/>
    </form>

    <div id="preview"></div>

    <script src="/static/jquery-1.12.4.js"></script>
    <script>
        function changeUpload(){
            $(\'#ifm1\').load(function(){
                var text=$(\'#ifm1\').contents().find(\'body\').text();
                var obj=JSON.parse(text);

                $(\'#preview\').empty();
                var imgTag=document.createElement(\'img\');
                imgTag.src="/"+obj.data;
                $(\'#preview\').append(imgTag);
            });
            $(\'#fm1\').submit();
        }

        function jqSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);
            $.ajax({
                url:/upload_file/,
                type:\'POST\',
                data:fd,
                processData:false,// tell jQuery not to process the data
                contentType:false,// tell jQuery not to set contentType
                success:function(arg,a1,a2){
                    console.log(arg);
                    console.log(a1);
                    console.log(a2);
                }
            })
        }

        function xhrSubmit(){
            //$(\'#fafafa\')[0]
            var file_obj=document.getElementById(\'fafafa\').files[0]; //你要上传的那个文件对象
            var fd=new FormData();
            fd.append(\'username\',\'root\');
            fd.append(\'fafafa\',file_obj);

            var xhr=new XMLHttpRequest(); //为了兼容IE旧版本
            xhr.open(\'POST\',\'/upload_file/\',true); //指定用什么形式发,发到哪里,是否异步(是)
            xhr.onreadystatechange=function(){
                if(xhr.readyState==4){
                    //接收完毕,放到XMLHttprequest对象里面了
                    var obj=JSON.parse(xhr.responseText);
                    console.log(obj); //这就是我们要拿的返回值
                }
            };
            xhr.send(fd); //发送的数据,字符串
        }

        function iframeSubmit(){
            $(\'#ifm1\').load(function(){
                var text=$(\'#ifm1\').contents().find(\'body\').text();
                var obj=JSON.parse(text);

                $(\'#preview\').empty();
                var imgTag=document.createElement(\'img\');
                imgTag.src="/"+obj.data;
                $(\'#preview\').append(imgTag);
            });
        }
    </script>
</body>
</html>

 urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^index/\', views.index),
    url(r\'^user_list/\', views.user_list),
    url(r\'^edit-(\d+)/\', views.user_edit),
    url(r\'^ajax/$\', views.ajax),
    url(r\'^ajax_json/$\', views.ajax_json),
    url(r\'^orm/\', views.orm),
    url(r\'^upload/\', views.upload),
    url(r\'^upload_file/\', views.upload_file),
]

 

 页面效果:

 

分类:

技术点:

相关文章:

  • 2021-12-23
  • 2021-12-08
猜你喜欢
  • 2022-12-23
  • 2021-11-20
  • 2021-11-20
  • 2022-01-01
相关资源
相似解决方案