Managing Uploaded Files in Django
Introduction
Uploading files is a common feature in web applications. Django provides a powerful set of tools and utilities to handle file uploads. This tutorial will guide you through the process of managing uploaded files in a Django application, from setup to handling and saving files.
Setting Up the Project
First, ensure you have Django installed. If not, you can install it using pip:
pip install django
Create a new Django project and app:
django-admin startproject fileupload
cd fileupload
python manage.py startapp uploads
Configuring Settings
Open settings.py and add the following configurations:
Add 'uploads' to INSTALLED_APPS:
INSTALLED_APPS = [
    ...
    'uploads',
]
                
                Configure media settings:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
                
            Creating Models
Define a model to handle file uploads in uploads/models.py:
from django.db import models
class Document(models.Model):
    description = models.CharField(max_length=255, blank=True)
    document = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)
                
            Run migrations to create the necessary database tables:
python manage.py makemigrations
python manage.py migrate
Creating Forms
Create a form for uploading files in uploads/forms.py:
from django import forms
from .models import Document
class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ('description', 'document',)
                
            Creating Views
Handle file uploads in uploads/views.py:
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .forms import DocumentForm
from .models import Document
def upload_file(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('file_list')
    else:
        form = DocumentForm()
    return render(request, 'upload.html', {'form': form})
def file_list(request):
    documents = Document.objects.all()
    return render(request, 'file_list.html', {'documents': documents})
                
            Creating Templates
Create templates for uploading and listing files:
upload.html:
<!DOCTYPE html>
<html>
<head>
    <title>Upload File</title>
</head>
<body>
    <h1>Upload File</h1>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>
    </form>
</body>
</html>
                
            file_list.html:
<!DOCTYPE html>
<html>
<head>
    <title>File List</title>
</head>
<body>
    <h1>File List</h1>
    <ul>
        {% for document in documents %}
            <li>
                <a href="{{ document.document.url }}">{{ document.description }}</a>
            </li>
        {% endfor %}
    </ul>
</body>
</html>
                
            Configuring URLs
Configure URLs for the views in uploads/urls.py:
from django.urls import path
from .views import upload_file, file_list
urlpatterns = [
    path('upload/', upload_file, name='upload_file'),
    path('', file_list, name='file_list'),
]
                
            Include the app URLs in the project’s urls.py:
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('uploads.urls')),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
                
            Testing the Application
Run the server and test the application:
python manage.py runserver
Visit http://127.0.0.1:8000/upload/ to upload files and http://127.0.0.1:8000/ to view the list of uploaded files.
Conclusion
In this tutorial, we covered the process of managing file uploads in a Django application. We configured settings, created models, forms, views, and templates, and tested the application. This should give you a solid foundation for handling file uploads in your Django projects.
