使用Ajax时无法将文件上传到Django中的媒体路径

时间:2015-07-16 18:06:58

标签: python ajax django django-views

我正在尝试将图片文件上传到我的setting.py和中指定的媒体网址 将图像的路径存储在数据库表中。 但是,当使用 Ajax 上传图像文件时,我无法实现此目的。

template.html

<div class="profpic" style="background:url(../../../static/app/img/test.png);background-size:cover">
            <input type="file" id="picpath" name="picpath" class="uploadpic" value=""/>
        </div>

Ajax:

function saveprof() {
            $.ajax({
                type: "POST",
                url: "saveprof",
                enctype: 'multipart/form-data',
                async: true,
                data: {
                    'picpath_Aj': $('#picpath').val(),
                    'profemail_Aj': $('#profemail').val(),
                    'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]").val()
                },
                success: function (data, textStatus, jqXHR) {
                    $('#message').html(data);
                }
            });
        }

Views.py

def saveprof(request):
if request.method == "POST":
    picpathV = request.POST['picpath_Aj']
else:
    profemailV = ''
    response_data = 'Nothing to update!'
    return HttpResponse(response_data, content_type="text/plain")
response_data = 'Empty'
try:
    res=td_table.objects.filter(id=request.session.get('proid')).update(picpath=picpathV)
except:
    response_data = 'Something went wrong!'
return HttpResponse(response_data, content_type="text/plain")

上面的代码工作正常,但我只能保存文件路径,如('C:\ fakepath \ file.jpg')..文件没有保存到媒体 Settings.py中提供的路径。

当我在视图中使用request.FILES时,我可以上传文件,当使用Django表单时..但在我的情况下,我需要使用Ajax函数完成此操作。 视图代码中可能出现什么问题?

这是我的models.py

class td_Student(models.Model):
firstname = models.CharField(max_length=300,blank=True)
picpath=models.FileField(upload_to=unique_filename)

def unique_filename(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s_%s.%s" %(uuid.uuid4(),time.strftime("%Y%m%d_%H%M%S"), ext)
    return os.path.join('documents/documents/'+time.strftime("%Y%m%d"), filename)

按照上述逻辑,文件名应类似于'documents / documents / 20150716 / a1f81a80-ce6f-446b-9b49-716b5c67a46e_20150716_222614.jpg' - 该值应存储在我的数据库表中。

settings.py

MEDIA_ROOT = 'C:/DJ/'
MEDIA_URL = '/DJ/'

1 个答案:

答案 0 :(得分:2)

问题不在于Django,但是在您的AJAX帖子中,您只是传递了名称,因此Django接收并保存了名称。

Solution:一旦用户选择了一个文件,就会发出change事件,在此更改中,您必须使用event.target.files将其存储在本地变量中来获取文件实例。将其传递给picpath_Aj'

// Add events
$('input[type=file]').on('change', prepareUpload);

// Grab the files and set them to our variable
function prepareUpload(event)
{
  files = event.target.files;
}

详细指南在这里http://abandon.ie/notebook/simple-file-uploads-using-jquery-ajax

使用JS和后端代码的替代Django解决方案是https://github.com/skoczen/django-ajax-uploader