Setting up an upload form within a django model

It often happens that you wish to add a file field to a registration or data insertion form ... So far we have not yet dealt with this type of field. The file field type can be treated either in isolation or within a model. To keep it simple, we are going to deal with this last type. 

Let's start by creating a mysite project in which we create an application named studentsApp


Next, let's create a directory named media within our mysite project. This folder must be configured within the file:

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

Next, let's configure the files of the studentsApp application:
from django.contrib import admin
from django.urls import path
from uploadFile import views

urlpatterns = [
path ('admin /',,
path ('students /', views.index),

Consider the Students model example that we have already covered in the django models tutorial, to which we add a file field that allows students to attach their photos during registration:

from django.db import models
class Students (models.Model):
name = models.CharField (max_length = 25)
email = models.EmailField (max_length = 40)
phone = models.IntegerField (max_length = 40)
section = models.CharField (max_length = 25)
photo = models.FileField (upload_to = 'photos')

The upload_to = 'photos' argument we added tells django that the uploaded files should be saved in a folder named media / photos. Do you have to manually create this directory? Well don't worry! Django will create it automatically when running the script. 


The necessary migrations are then carried out:

python makemigrations studentsApp

and after that :

python migrate

We then create a file that will generate the form:
from django.forms import ModelForm
from studentsApp.models import Students

class StudentsForm (ModelForm):
class Meta:
model = Students
fields = ['name', 'email', 'phone', 'section', 'photo']

The views: will then be created in the same way as in the previous tutorial concerning django models with the difference of adding a request.FILES parameter

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import StudentsForm

def index (request):
if request.method == 'POST':
form = StudentsForm (request.POST, request.FILES)
if form.is_valid (): ()
return HttpResponseRedirect ('/ students /')
form = StudentsForm ()
return render (request, 'index.html', {'form': form})

Finally, we just have to create the index.html template file: template/index.html

<! DOCTYPE html>
<html lang = "in">
<meta charset = "UTF-8">
<title> Title </title>

<form enctype = "multipart / form-data" method = "post">
{% csrf_token%}
<button type = "submit" class = "save btn btn − default"> Save </button>


Without forgetting the parameter enctype = "multipart / form-data"  

Younes Derfoufi

Leave a Reply