Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 7 of 9 · Django Forms & Validation
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?