头像图片上传、预览、传后端、media配置

1、注册页面因为使用form组件,后端forms.py文件中无avatar字段,所以前端应该单独写个标签,来处理avatar。      {% csrf_token %}

        <div class="col-md-6 col-md-offset-3">
            <form action="" novalidate>

               {#     form组件#}
                {% for field in form %}
                    <div class="form-group">
                        <label for="">{{ field.label }}</label>
                        {{ field }} <span class="error pull-right"></span>
                    </div>
                {% endfor %}

                  {#    图片#}
                <div class="form-group">
                    <label for="avatar">头像<img class="avatar" src="/static/img/default.png" alt=""></label>
                    <input type="file" id="avatar">
                </div>

                      {#     提交#}
                <input type="button" class="btn btn-default reg_btn pull-right" value="提交"><span class="error"
                                                                                                 style="color: red;margin-left: 20px"></span>
            </form>
        </div>         
页面代码

2、预览js部分代码(onload 事件会在页面或图像加载完成后立即发生。window.onload事件会在页面加载完成后触发)

    // 图像预览
    $("#avatar").change(function () {
        {#找到上传的图片文件#}
        var choose_file = $(this)[0].files[0];
        {#实例化一个filereader对象#}
        var reader = new FileReader();
        reader.readAsDataURL(choose_file);
        {#src是固定写法,why未知#}
        reader.onload = function () {
            $(".avatar").attr("src", reader.result)
        }
    });

    // 图像预览(百度版)
$("input[type='file']").on('change', function () {
    var oFReader = new FileReader();
    var file = document.getElementById('input-file').files[0];
    Reader.readAsDataURL(file);

    oFReader.onloadend = function(oFRevent){
        var src = oFRevent.target.result;
        $('.content').attr('src',src);
        alert(src);
    }
});
图像预览js

3、注意

1、label 里面放src="/static/img/default.png" 默认图片(创建static/img文件夹以及文件);input type是file  
2、预览change事件给< input type=“file”>  绑定 ,而不是label,所以是$(this) 
3、fakepath 这里的fakepath就是现代浏览器为了隐藏了文件实际路径而生成的字符串。
4、后端取得图片数据,request.FILES.get("avatar"),不是POST.get("avatar")!!!

4、利用ajax上传文件代码 formdata

<script>
 // 注册事件
    $(".reg_btn").click(function () {
        var formdata = new FormData();
        formdata.append("user", $("#id_user").val());
        formdata.append("pwd", $("#id_pwd").val());
        formdata.append("repeat_pwd",  $("#id_repeat_pwd").val());
        formdata.append("email", $("#id_email").val());
        formdata.append("avatar", $("#avatar")[0].files[0]);
        formdata.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());


        $.ajax({
            url: "",
            type: "post",
            processData: false,
            contentType: false,
            data: formdata,
            success: function (data) { alert("上传成功!")
            }
        });

    })
</script>
js

ajax提交的数据使用的formdata 里面的k 应该和form组件内的k一样,除非不校验  例如 图片!!!

processData设置为false。因为data值是FormData对象,不需要对数据做处理。

<form>标签添加enctype="multipart/form-data"属性。

cache设置为false,上传文件不需要缓存。

contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false。

5、Media配置

不希望把用户上传的放在static中,app下创建media/avatars文件夹。

http://www.cnblogs.com/yuanchenqi/articles/7629939.html#_label5

html
<label for="avatar">头像<img class="avatar" src="/static/img/default.png" alt=""></label>
<input type="file" id="avatar">
class UserInfo(AbstractUser):

    avatar=models.FileField(upload_to='avatars/',default="/avatars/default.png")

#如果实例化一个user对象,avatar字段接受一个文件对象,这个文件对象会默认存到项目的根目录的。

配置
settings.py
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media")  
#  blog(app)_media_avatar文件夹中  
MEDIA_URL="/media/"

项目urls.py
from django.views.static import serve
from bbs_blog_project import settings
urlpatterns    url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

 

posted @ 2018-04-16 23:13  nick560  阅读(746)  评论(0编辑  收藏  举报