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: 
settings.py

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

Next, let's configure the url.py files of the studentsApp application:

urls.py
from django.contrib import admin
from django.urls import path
from uploadFile import views

urlpatterns = [
path ('admin /', admin.site.urls),
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: models.py

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 manage.py makemigrations studentsApp

and after that :

python manage.py migrate

We then create a forms.py file that will generate the form:

forms.py
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 views.py

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 ():
form.save ()
return HttpResponseRedirect ('/ students /')
else:
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">
<head>
<meta charset = "UTF-8">
<title> Title </title>
</head>
<body>

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

</body>

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

Younes Derfoufi
my-courses.net

Leave a Reply