Interview question
How do you handle file uploads with Django forms? Django forms के साथ file uploads कैसे handle करें?
Answer
File uploads require the form's enctype to be multipart/form-data and the view must access request.FILES separately from request.POST.
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'cover'] # cover is an ImageField/FileField on the model
def upload_book(request):
if request.method == 'POST':
# BOTH request.POST (text fields) and request.FILES (file fields) needed
form = BookForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('book-list')
else:
form = BookForm()
return render(request, 'upload.html', {'form': form})
<!-- Template - enctype is REQUIRED for file uploads -->
<form method='post' enctype='multipart/form-data'>
{% csrf_token %}
{{ form.as_p }}
<button type='submit'>Upload</button>
</form>
<!-- Without enctype='multipart/form-data', file data is silently NOT sent -->
# Model with a file field
class Book(models.Model):
title = models.CharField(max_length=200)
cover = models.ImageField(upload_to='covers/%Y/%m/') # organized by year/month
# Validating uploaded file size/type manually
def validate_file_size(value):
max_size_mb = 5
if value.size > max_size_mb * 1024 * 1024:
raise forms.ValidationError(f'File size cannot exceed {max_size_mb}MB')
class BookForm(forms.ModelForm):
cover = forms.ImageField(validators=[validate_file_size])
class Meta:
model = Book
fields = ['title', 'cover']
# Accessing an uploaded file's properties directly in a view
def check_upload(request):
if request.method == 'POST':
uploaded_file = request.FILES.get('cover')
if uploaded_file:
print(uploaded_file.name, uploaded_file.size, uploaded_file.content_type)File uploads के लिए form का enctype multipart/form-data होना चाहिए और view को request.FILES को request.POST से अलग access करना चाहिए।
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'cover']
def upload_book(request):
if request.method == 'POST':
form = BookForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('book-list')
else:
form = BookForm()
return render(request, 'upload.html', {'form': form})
<!-- enctype ज़रूरी है -->
<form method='post' enctype='multipart/form-data'>
{% csrf_token %}
{{ form.as_p }}
<button type='submit'>Upload</button>
</form>
class Book(models.Model):
title = models.CharField(max_length=200)
cover = models.ImageField(upload_to='covers/%Y/%m/')
def validate_file_size(value):
max_size_mb = 5
if value.size > max_size_mb * 1024 * 1024:
raise forms.ValidationError(f'File size {max_size_mb}MB से ज़्यादा नहीं हो सकता')
class BookForm(forms.ModelForm):
cover = forms.ImageField(validators=[validate_file_size])
class Meta:
model = Book
fields = ['title', 'cover']Was this answer clear?