Файлы не загружаются в выбранный каталог после валидации формы с Dropzone.js и Django

Я пытаюсь реализовать функцию drag & drop для файлов на моей веб-странице (сейчас ограничена изображениями в целях тестирования). Я использую Django и Dropzone.js

Я думаю, что реализовал все правильно, но по какой-то причине, даже если форма подтверждена, содержимое не загружается в нужную папку.

forms.py

from django.forms import ModelForm
from crown_agents.models import FileHistory

class UploadFileForm(ModelForm):
    class Meta:
        model = FileHistory
        fields = ('file_image',)

models.py

from django.db import models
from django.contrib.auth.models import User

class FileHistory(models.Model):
    file_image = models.ImageField(null=True, blank=True, upload_to="project_files/")
    user = models.ForeignKey(
        User,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
    )
    timestamp = models.DateTimeField( auto_now_add=True)

views.py

from django.contrib.auth.decorators import login_required
from django.conf import settings
from django.shortcuts import HttpResponse, render
from .forms import UploadFileForm

@login_required
def project_page(request):
    
    context = {}
    context['nbar'] = projects
    if request.method == 'POST':
        print(request.FILES)
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            # file is saved
            form.save()
            return render(request, 'project_page.html', context)
        print (form.errors)
    else:
        form = UploadFileForm()
    context['form'] = form
    return render(request, 'project_page.html', context)

urls.py from django.conf import settings from django.conf.urls.i18n import i18n_patterns из django.conf.urls.static import static from django.contrib import admin from django.urls import path, include from django.contrib.auth import views as auth_views из django.utils.translation import gettext_lazy as _

from . import views


urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += i18n_patterns(
    path('project_page', views.project_page, name='project_page'),
 
)

settings.py (truncated)

STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]. STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

project_page.html (в основном обычный html, который наследуется от base.html)

<div class="container">
  <label for="dropzone">Upload images dropzone</label>
  <form action="project_page" id="DidDropzone" class="dropzone dz" accept-charset="UTF-8" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="dz-message">Click Here or Drop Files Here To Upload - 500kb maximum (0.5mb)</div>
  </form>  
  <br>  
  <button id="image-btn" type="submit" >Add images</button>                        
</div>

base.html

{% load static %}
{% load bootstrap5 %}
<!DOCTYPE html>
<html lang="en">
    <head>
        <!-- Bootstrap CSS -->
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
            integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
        <!-- Bootstrap 5.0.2 JS -->
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
        <!-- jQuery CDN -->
        <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
        <script src="https://rawgit.com/enyo/dropzone/master/dist/dropzone.js"></script>
        <link rel="stylesheet" href="https://rawgit.com/enyo/dropzone/master/dist/dropzone.css">
        <link rel="stylesheet" href="{% static 'css/dropzone_style.css' %}">
        <script src="{% static 'js/dropzone.js' %}" defer></script>
        </meta>
        <title>{% block title %}web{% endblock %}</title>
    </head>
    <body>
        <div class="wrapper">
            <!-- Sidebar  -->
            <div id="content">
                {% block content %}{% endblock %}
            </div>
        </div>
    </body>
</html>

dropzone.js

var Drop = Dropzone.options.DidDropzone = {

    autoProcessQueue: false, //stops from uploading files until user submits form
    paramName: "image", // The name that will be used to transfer the file
    maxFilesize: 8, // Maximum size of file that you will allow (MB)
    clickable: true, // This allows the dropzone to select images onclick
    acceptedFiles: '.jpg,.jpeg,.JPEG,.JPG,.png,.PNG', //accepted file types
    maxFiles: 10, //Maximum number of files/images in dropzone
    parallelUploads: 10,
    previewTemplate: '<div class="dz-preview dz-image-preview">'+
                        '<div class="dz-image">'+
                        '<img data-dz-thumbnail />'+
                        '</div>'+

                      '<div class="dz-details">'+
                        '<div class="dz-filename"><span data-dz-name></span></div>'+
                        '<div class="dz-size" data-dz-size></div>'+
                      '</div>'+

                      '<div class="dz-success-mark"><span>✔</span></div>'+
                      '<div class="dz-error-mark"><span>✘</span></div>'+
                      '<div class="dz-error-message"><span data-dz-errormessage></span></div>'+
                    '</div>',
    init: function(){

        var submitButton = document.querySelector("#image-btn")
        var url = $('#DidDropzone').attr("action")
        myDropzone = this;

        //process the queued images on click
        submitButton.addEventListener("click", function() {
            myDropzone.processQueue(); 
        });

        //fire the images to url
        myDropzone.on("processing", function(file) {
          myDropzone.options.url = url;
        });

        //clear the dropzone when complete
        myDropzone.on("complete", function(file) {
            myDropzone.removeFile(file);
        });
    },
    success: function(file, json){

        alert("Perfect! Now visit your gallery...")      
        
    },
}

Форма четко подтверждена и система не выдает никаких ошибок, я даже могу вывести имя файла из представления с помощью print(request.FILES):

enter image description here

Но по какой-то причине файлы не загружаются в папку media/project_files. Почему?

Вернуться на верх