python - Django:使用 Ajax 上传和保存文件

标签 python jquery django ajax

我不确定目录是否有误,或者我的代码中是否存在某种常见错误,但我无法将上传的文件保存到文件夹中,或者更具体地说,无法保存到演示的媒体文件夹中在很多例子中。

我只是获取一个文本字段和文件并使用 Ajax 将其保存在数据库中,它也可以工作,除了无论我选择什么文件,即使我创建一个文件也不会保存在媒体文件夹中手动也不是它自己创建一个。我可以在没有 Ajax 的情况下使它工作,但不能使用它。也许这与我如何通过 Ajax 发送和处理数据有关,但我已经浏览了大量论坛来尝试修复它,但到目前为止没有结果。我已经仔细检查了其他所有内容,例如 settings.py 配置和我导入的库,一切看起来都井井有条。我正在分享下面的代码。

index.html

<body>
<div class="container-fluid">
    <div class="col-md-4">
        <form id="data" enctype="multipart/form-data">
            <label for="docn">
                <input type="text" id="docn" placeholder="Please enter document name">
            </label>

            <label for="docc">
                <input type="file" id="doc" name="docu">
            </label>

            <button type="button" onclick="enterdata()">Submit</button>

        </form>
    </div>
</div>
<script>
    function enterdata() {
        var token = '{{ csrf_token }}';
        alert('csrf generated');

        $.ajax({
            type: 'POST',
            url: '/user',
            data: {
                dcn: $('#docn').val(),
                dc: $('#doc').val(),
            },
            headers: {'X-CSRFToken': token},
            success: function () {
                alert("Added");
            }
        })

    }
</script>
</body>

views.py

from django.shortcuts import render
from django.http import HttpResponse
from fileup.models import *
from django.core.files.storage import FileSystemStorage

def insert(request):
    return render(request, 'index.html')

def testing_data(request):
    if request.method == 'POST':
        dcn1 = request.POST['dcn']
        dc = request.POST['dc']

        request_file = request.FILES['docu'] if 'docu' in request.FILES else None
        if request_file:
            fs = FileSystemStorage()
            file = fs.save(request_file.name, request_file)
            fileurl = fs.url(file)

        FileDB.objects.create(
            docname=dcn1,
            doc=dc,
        )

        return HttpResponse('')

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', insert),
    path('user', testing_data),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

模型.py

from django.db import models

class FileDB(models.Model):
    docname = models.CharField(max_length=255)
    doc = models.FileField()

settings.py 配置

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

这就是完整的项目。最终目标是将路径和文件名保存在数据库中,并将所选文件上传到媒体文件夹中。前者正在做,但后者没有积极的结果。

谢谢。

最佳答案

你说除了文件的存储位置外一切正常。 无论您的 MEDIA_ROOT 设置如何,以下代码都会将上传的文件存储在/media/photos 下:

from django.core.files.storage import FileSystemStorage
from django.db import models

fs = FileSystemStorage(location='/media/photos')

class Car(models.Model):
    ...
    photo = models.ImageField(storage=fs) 

希望对您有所帮助。由 Django Doc 提供:https://docs.djangoproject.com/en/3.1/topics/files/

关于python - Django:使用 Ajax 上传和保存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65103103/

相关文章:

python - 如何将时间拆分为小时?

javascript - 了解 hashchange 事件的执行顺序

javascript - 不能使用 jQuery 添加两个小数

python - pytest-django 中的重置序列

python - Tornado :将字符串数据传递给渲染页面中的 JavaScript 代码

python - 在 DataFrame 中获取前一个工作日

javascript - 如何使用 id 获取按钮并调用其点击事件 - Angular

python - 重复列名 'model_id' django mysql 迁移错误

django - 可以同时使用多个数据库和 South 吗?

python - 如何从 Python 2.7 中的 tell() 计数中排除\n 和\r