Skip to main content
 首页 » 编程设计

python之Django 可以在没有 FORMS 的情况下上传文件吗

2025年04月02日36sxdcgaq8080

我目前正在使用自定义 HTML 模板,不使用我的 Django 应用程序中的表单来上传特定路径中的图像。

应用结构

src/ 
    media/ 
        app/ 
            img/ 
    app_name/ 
        templates/ 
            app_name/ 
                app_template.html 
        __init__.py 
        admin.py 
        apps.py 
        models.py 
        tests.py 
        urls.py 
        views.py 
    proj_name/ 
        __init__.py 
        settings.py 
        urls.py 
        wsgi.py 
    manage.py 

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 
MEDIA_URL = '/media/' 

模型.py

class Document(models.Model): 
    doc_file = models.FileField(upload_to='app/img') 

views.py

def app_save(request): 
    if request.method == 'POST': 
        newdoc = Document(doc_file=request.FILES.get('myfile')) 
        newdoc.save() 

app_template.html

<form id="myform" method="POST" action="{% url 'my_app:save' %}"  
      enctype="multipart/form-data"> 
 
    <input type="file" name="myfile"> 
    <input type="submit">  
</form> 

#结果 提交表单后,我没有任何内部服务器错误,也没有 python 回溯。但是在 app/img 路径和我的数据库中没有上传图像,由于 newdoc.save() 查询,我插入了一条空白记录。

可以在没有表格的情况下进行文件管理吗?


#更新

我在 forms.py 上添加了这个

class UploadFileForm(forms.Form): 
    file = forms.FileField() 

并将我的 app_template.html 更新为:

<form id="myform" method="POST" action="{% url 'my_app:save' %}"  
      enctype="multipart/form-data"> 
 
    {{ form.file }} 
    <input type="submit">  
</form> 

然后我想在 views.py 中包含加载 app_template.html 的功能:

def index(request): 
    form = UploadFileForm() 
    return render(request, 'app_name/app_template.html', { 'form': form }) 

并且还将 app_save() 函数更新为:

 def app_save(request): 
    form = UploadFileForm(request.POST, request.FILES) 
    if request.method == 'POST': 
        if form.is_valid(): 
            newdoc = Document(doc_file=request.FILES.get('file')) # note 'file' is the name of input file of a form. 
            newdoc.save() 

现在的问题是

在应用程序中没有发现错误,但是没有使用上传的图像文件创建的 media/app/img 路径。什么地方出了错?我想我在这里漏掉了什么。

请您参考如下方法:

您的后端代码没问题。问题出在前端。您不能像其他字段一样使用 jQuery.ajax 提交文件输入。使用 FormData :

$('#myform').submit(function(event) { 
    if(window.FormData !== undefined) { 
        event.preventDefault(); 
 
        var formData = new FormData(this); 
        var xhr = new XMLHttpRequest(); 
        xhr.open('POST', $(this).attr('action'), true); 
        xhr.setRequestHeader('X-REQUESTED-WITH', 'XMLHttpRequest')             
        xhr.onreadystatechange = function() { 
            if(xhr.readyState == 4) { 
                if(xhr.status == 200) { 
                    result = JSON.parse(xhr.responseText); 
                    // Code for success upload 
                } 
                else { 
                    // Code for error 
                } 
            } 
        }; 
        xhr.send(formData); 
    } 
});