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.
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.
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"
my-courses.net