【问题标题】:Cannot handle file upload in Django when request comes from Ajax and a form当请求来自 Ajax 和表单时,无法在 Django 中处理文件上传
【发布时间】:2015-10-06 17:23:53
【问题描述】:

我正在尝试从 Ajax 帖子处理 Django 中的文件上传,它不起作用:(

下面是上传的html文件中的代码:

<form action="{% url 'saveprof' %}" method="post" enctype="multipart/form-data" id="form1">
        {% csrf_token %}
        <div class="profpic" style="background:url(../../../static/app/img/profile.png)">
            <input type="file" id="picpath" name="picpath" class="uploadpic" value=""/>
        </div>
        </form>            
        {% csrf_token %}

保存

下面的Ajax方法用于发布数据:

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

这可能吗?

如何使用 html 表单进行文件上传并通过上述 ajax 方法发送这些数据?

这里是风景

def saveprof(request):
    if request.method == "POST":
        user_form1 = DocumentForm(request.POST, request.FILES)
        if user_form1.is_valid():
            user_form1.save()
    #And code to save some other fields as well along with the user_form1

Form.py

class DocumentForm(forms.ModelForm):
    picpath = forms.FileField()
    class Meta:
        model = td_Student
        fields = ('picpath',)

模型.py

class td_Student(models.Model):
    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

运行此代码时,user_form1.save() 永远不会被执行,因为它在视图中的有效性条件失败。

我尝试了几个小时来找出问题所在,但无法解决。 您能帮我确定一下这个实现有什么问题吗?

图像未保存在服务器中:(..我无法按预期获取文件名(例如:'documents/documents/20150716/a1f81a80-ce6f-446b-9b49-716b5c67a46e_20150716_222614.jpg' unique_filename 方法)

请注意,当我使用 HTML 表单而不是使用 Ajax 发布时,我可以成功上传图片。但我对当前实现的要求仅是 Ajax。

【问题讨论】:

  • 找到未验证内容的一种可能的简单方法是print form.errors,而不是is_valid
  • 嗨 Raja,我已经用过了,错误是,'需要字段 picpath'.. 看起来 picpath 没有通过 Ajax 方法发送到我的视图。 picpath 的值是错误的(对于任何上传的图像,它都会显示类似 'c:\fakepath\imagename.jpg' )
  • 您可以在saveprof 视图中打印request.POST 吗?似乎您没有使用 picpath 键发送任何值。

标签: jquery python ajax django


【解决方案1】:

我们说你有这样的表格:

<form method="POST" name="form" id="form" enctype="multipart/form-data">
    <input type="file" id="img"/>
    <input type="submit"/>
</form>

您必须获得用户选择的 img,因此您的 javascript 必须如下所示:

$(document).ready(function(){
    $('form').on('submit', function(e){
        e.preventDefault();
        var data = new FormData($('form').get(0));
        $.ajax({
            url: :"/URL",
            method: "POST",
            data: data,
            success: function(data){},
            error: function(data){},
            processData: false,
            contentType: false,
        });
    });
});

现在您将能够检索用户在 django 中选择的 img:

request.FILES

【讨论】:

  • 嗨 Navneet,谢谢 :).. 我想使用锚标记而不是提交类型按钮.. 当我单击锚按钮时应该如何调用此方法?我将其用作按钮 "Save" 相当于 "$('form').on('submit', function(e ){" 对于上面的锚按钮?
  • 您好,您可以执行类似“提交链接”的操作.希望这会有所帮助。
  • 您可以查看stackoverflow.com/questions/275039/… 了解更多选项。 :)
  • 感谢您的帮助 Navneet :)
猜你喜欢
  • 1970-01-01
  • 2017-05-24
  • 2013-11-03
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多