如何在Django中接收内联表单上传的文件?

6 投票
4 回答
1379 浏览
提问于 2025-04-15 18:46

我正在尝试在 Django 管理面板中创建一个“酷炫”的图片上传界面。问题是,我使用了内联界面来上传图片实例,但我又用 jQuery Ajax 表单来上传图片,这样就需要为上传创建另一个表单。现在,Django 的视图函数无法接收到 request.FILES,因为我创建这个表单时没有使用 django.forms,所以在视图函数中无法指定要使用哪个表单。因此,我无法重写内联界面的标准视图函数,也无法使用 django.forms 重新创建这个表单。所以这段代码似乎不起作用:

我的表单:

<form id="uploadForm" enctype="multipart/form-data" method="post" action="upload_picture/">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>

我的视图函数:

def upload_picture(request):
    if request.method == 'POST':
        save_original(request.FILES['file'])
    return HttpResponseRedirect('admin/edit_inline/picture_editor.html')

也许我应该换个完全不同的方法呢?

4 个回答

0

我建议使用一个模板片段来生成表单,这个片段也可以单独生成并发送给jQuery。这样可以保留CSRF令牌,并且可以正确解析带有表单的文件。

比如你可以这样使用:

$.ajax({
    url: "/uploadPicture?JustForm",
    dataType: ($.browser.msie) ? "text" : "html",
    success: function(data){
        // Put the form contained in data onto the page (it's a string)
        $("formContainer").innerHtml(data)
    }
});

然后让你的表单直接由你的视图返回。

def upload_picture(request):
    if request.GET.has_key('JustForm'):
        return YourFormObject.as_html() <- will include CSRF tags for compat with 1.2
    if request.method == 'POST':
        save_original(request.FILES['file'])
    return HttpResponseRedirect('admin/edit_inline/picture_editor.html')

(忽略明显的错误,把它当作伪代码来看待)

0

我测试了这段代码,文件上传得很好。你能把你用来构建表单的jquery代码给我看看吗?

谢谢。

2

request.FILES应该可以正常使用这个手动创建的表单。Django对这个字段的处理没有什么特别之处,只是添加了一个id="id_file"。我很确定,如果你没有设置id,也不会影响数据传到request.FILES里。

In [5]: from django import forms

In [6]: class GenericFileForm(forms.Form):
   ...:         file = forms.FileField()
   ...: 

In [7]: g = GenericFileForm()

In [8]: print g
<tr><th><label for="id_file">File:</label></th><td><input type="file" name="file" id="id_file" /></td></tr>

撰写回答