Как загружать файлы с помощью Django и Python

Я хочу позволить пользователю загружать некоторые файлы excel, и сначала я пытаюсь сохранить их в media/uploaded/int:projectid (который я хочу создать, если он еще не создан).

Но когда я пытаюсь загрузить его, в /admin он говорит: Ошибка в поле "template_file": Это поле является обязательным. Ошибка в поле "название": Это поле обязательно для заполнения.

вот мой views.py:

@csrf_protect
@login_required(login_url='login')
def uploadTemplate(request, proyecto_id):
    proyecto = get_object_or_404(Project, id=proyecto_id)
    if request.method == 'POST':
        form = UploadTemplateForm(request.POST, request.FILES)
        if form.is_valid():
            template_file = request.FILES.get('template_file')
            if template_file:
                try:
                    create_project_folder(proyecto)  # Crear la carpeta del proyecto si no existe
                    handle_uploaded_file(template_file, proyecto)
                    messages.success(request, 'File uploaded successfully.')
                    return redirect('success')
                except Exception as e:
                    messages.error(request, f'Error handling the file: {e}')
            else:
                messages.error(request, 'No file provided in the form.')
        else:
            for field, errors in form.errors.items():
                for error in errors:
                    messages.error(request, f'Error in field "{field}": {error}')
    else:
        form = UploadTemplateForm()
    return render(request, 'uploadFileBox.html', {'form': form, 'project': proyecto})

def create_project_folder(proyecto):
    base_folder = 'media/uploaded'
    project_folder = os.path.join(base_folder, str(proyecto.id))
    if not os.path.exists(project_folder):
        os.makedirs(project_folder)

def handle_uploaded_file(f, proyecto):
    try:
        base_folder = 'media/uploaded'
        project_folder = os.path.join(base_folder, str(proyecto.id))
        file_path = os.path.join(project_folder, f.name)
        with open(file_path, 'wb+') as destination:
            for chunk in f.chunks():
                destination.write(chunk)
        print("Archivo guardado correctamente.")
    except Exception as e:
        print("Error al manejar el archivo:", e)

my uploadFileBox.html:

<form id="uploadForm" action="{% url 'uploadFile' project.id %}" method="post" enctype="multipart/form-data">
                    {% csrf_token %}
                    <input class="file-input" type="file" name="template_file" accept=".xls, .xlsx">
                      <svg width="50%" height="50%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                          <path d="M14 11H8M10 15H8M16 7H8M20 6.8V17.2C20 18.8802 20 19.7202 19.673 20.362C19.3854 20.9265 18.9265 21.3854 18.362 21.673C17.7202 22 16.8802 22 15.2 22H8.8C7.11984 22 6.27976 22 5.63803 21.673C5.07354 21.3854 4.6146 20.9265 4.32698 20.362C4 19.7202 4 18.8802 4 17.2V6.8C4 5.11984 4 4.27976 4.32698 3.63803C4.6146 3.07354 5.07354 2.6146 5.63803 2.32698C6.27976 2 7.11984 2 8.8 2H15.2C16.8802 2 17.7202 2 18.362 2.32698C18.9265 2.6146 19.3854 3.07354 19.673 3.63803C20 4.27976 20 5.11984 20 6.8Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                      </svg>
                      
                      <p>Browse files to upload</p>
                  </form>

urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.SignupPage, name='signup'),
    path('login/',views.LoginPage, name='login'),
    path('home/',views.HomePage,name='home'),
    path('logout/',views.LogoutPage,name='logout'),
    path('home/create/', views.createProject, name='createProject'),
    path('projects/',views.viewProjects,name='viewProjects'),
    path('projects/<int:project_id>/information', views.projectDetail, name='projectDetail'),
    path('projects/<int:proyecto_id>/members/', views.projectMembers, name='projectMembers'),
    path('static/Templates/', views.downloadTemplate, name='downloadTemplate'),
    path('delete-project/<int:project_id>/', views.deleteProject, name='deleteProject'),
    path('projects/<int:proyecto_id>/upload-file/', views.uploadTemplate, name='uploadFile')
    # path('projects/<int:project-id/dashboard>',views.X, name='dashboard')
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я попытался загрузить файл с точки зрения пользователя, и это не работает

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