upload multiple files django

How to Upload Multiple Files in Django

Uploading multiple files is a common requirement in web applications, and Django makes it a breeze to implement. In this tutorial, we’ll walk through the process of enabling users to upload multiple files using Django’s powerful features. From handling the frontend to the backend, we’ve got you covered. So, let’s dive right in and learn how to handle multi-file uploads effortlessly.

Setting Up the Project

Before we get started, make sure you have Django installed. If not, install it using pip:

pip install django

Next, create a new Django project and app:

django-admin startproject multi_file_upload_project
cd multi_file_upload_project
django-admin startapp file_uploads

Models and Database Setup

Let’s create a simple model to represent the uploaded files in this example. Inside the models.py file of the file_uploads app, add the following:

from django.db import models

class UploadedFile(models.Model):
    file = models.FileField(upload_to='uploads/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.file.name

Make sure to run the migrations to create the necessary database table:

python manage.py makemigrations
python manage.py migrate

Creating the Upload Form

Now, let’s create a form to handle the file uploads. In the forms.py file of the file_uploads app, add the following code:

from django import forms
from .models import UploadedFile

class FileUploadForm(forms.ModelForm):
    class Meta:
        model = UploadedFile
        fields = ('file',)

Uploading Files in Views

In the views.py file of the file_uploads app, we’ll define a view to handle file uploads:

from django.shortcuts import render, redirect
from .forms import FileUploadForm

def upload_files(request):
    if request.method == 'POST':
        form = FileUploadForm(request.POST, request.FILES)
        if form.is_valid():
            return redirect('success')  # Replace 'success' with the name of your success page URL
        form = FileUploadForm()
    return render(request, 'upload.html', {'form': form})

Frontend: Creating the Upload Form Template

In the templates folder of the file_uploads app, create a new file called upload.html and add the following:

<!DOCTYPE html>
    <title>File Upload</title>
    <h2>Upload Files</h2>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>

URL Configuration

Let’s define the URL configuration to wire up the view and template. In the urls.py file of the file_uploads app, add the following:

from django.urls import path
from . import views

urlpatterns = [
    path('upload/', views.upload_files, name='upload'),
    # Add any other URLs you may need

Next, include the app URLs in the main project’s urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('file_uploads/', include('file_uploads.urls')),
    # Add other app URLs here if needed

Handling Uploaded Files

The uploaded files are now stored in the ‘uploads/’ directory within your media root. Don’t forget to configure your media settings in settings.py:

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


Congratulations! You’ve successfully implemented multi-file uploads in Django. Users can now upload multiple files, and you can access these files using the UploadedFile model. Django’s built-in features make this process a breeze, allowing you to focus on building other parts of your web application.

Remember to handle file validation, security, and other considerations in a real-world application.

Remember to replace your_success_page with the URL of the page you want to redirect users after a successful file upload.

I hope this blog post helps you in learning how to upload multiple files in Django. If you have any questions or suggestions, feel free to leave a comment below. Happy coding!

Please note that this blog post is solely for educational purposes, and you should always consider best practices and security measures when implementing file uploads in a production environment.

Happy coding!