Heat 1 tablespoon olive oil in a large Dutch oven or soup pot over medium-high heat. Once hot, add ground beef and Italian sausage. Using a wooden spoon, break the meat into bite-sized pieces. Cook, stirring occasionally, for about 5-7 minutes or until browned.
Transfer the cooked meat to a plate using a slotted spoon. Drain the excess fat, keeping about 2 tablespoons of drippings in the pot for flavor.
Add the remaining 1 tablespoon olive oil, onion, carrot, and celery to the same pot. Saute for about 4-5 minutes or until vegetables start to soften. Add garlic and cook for about 30-60 seconds or until fragrant. Stir in tomato paste and cook for an additional minute.
Return the cooked meat back to the pot. Stir in crushed tomatoes, chicken broth, water, Italian seasoning, dried basil, red pepper flakes, salt, and pepper. Bring to a boil, then reduce heat to low. Cover with a lid and let simmer for 20 minutes, stirring occasionally.
Add cannellini beans, kidney beans, and ditalini pasta. Cook uncovered until the pasta is al dente, about 8-10 minutes, stirring occasionally so the pasta doesn’t stick to the bottom of the pot.
Once the pasta is al dente, stir in the baby spinach and chopped parsley. Cook for 1-2 minutes until the spinach wilts. Top with freshly grated Parmesan cheese and chopped parsley. Serve hot with crusty bread for dipping.
