DEV Community

Cover image for How to Validate Rectangular Images in Django Using Python
Vicente G. Reyes
Vicente G. Reyes

Posted on

How to Validate Rectangular Images in Django Using Python

When working with image uploads in a Django project, there may be situations where you need to enforce specific dimensions, such as ensuring the uploaded image is rectangular (not square). This can be particularly useful for profile headers, banners, or media requiring non-square formats.

In this article, we’ll walk through a simple solution using Django's validation system and the Pillow library.

Prerequisites

Before implementing the solution, ensure you have the following dependencies installed:

  1. Django (for web framework functionality)
  2. Pillow (for image processing)

If you don’t have Pillow installed, you can add it using:

python -m pip install pillow
Enter fullscreen mode Exit fullscreen mode

Writing the Validator

To validate whether an uploaded image is rectangular, we need to check the width and height of the image. If both dimensions are equal, it means the image is square, and we’ll raise a validation error.

Here’s the code for the custom validator:

from django.core.exceptions import ValidationError
from PIL import Image

def validate_rectangular_image(image):
    """
    Validator to ensure an uploaded image is rectangular and not square.
    """
    image = Image.open(image)  # Open the uploaded image using Pillow
    width, height = image.size  # Extract dimensions

    if width == height:  # Check if image is square
        raise ValidationError("Uploaded image must be rectangular (not square).")

    return image
Enter fullscreen mode Exit fullscreen mode

Integrating the Validator with a Django Model

To use this validator in your Django application, you can add it to a model field. For instance, let’s assume you have an ImageField in a model for a user profile banner:

from django.db import models
from .validators import validate_rectangular_image  # Import the custom validator

class Profile(models.Model):
    name = models.CharField(max_length=100)
    banner_image = models.ImageField(
        upload_to='banners/', 
        validators=[validate_rectangular_image],
        help_text="Please upload a rectangular image for the banner."
    )

    def __str__(self):
        return self.name
Enter fullscreen mode Exit fullscreen mode

How It Works:

  • The validate_rectangular_image function is called whenever a file is uploaded to the banner_image field.
  • If the image is square, a ValidationError is raised, preventing the file from being saved.
  • Only rectangular images will pass validation and be uploaded successfully.

Handling Validation Errors in Forms

If you’re using Django forms for image uploads, the error will be displayed to users when they submit an invalid image.

For example, a simple form could look like this:

from django import forms
from .models import Profile

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['name', 'banner_image']
Enter fullscreen mode Exit fullscreen mode

When a user uploads a square image, they will see the error message:

"Uploaded image must be rectangular (not square)."

Testing the Validator

You can test the functionality by trying to upload both square and rectangular images.

  1. Square Image (e.g., 300x300):
    The validator will reject the file and raise a ValidationError.

  2. Rectangular Image (e.g., 400x300):
    The validator will accept the file, and the image will be uploaded successfully.

Final Notes

By using this approach, you can enforce image dimension requirements seamlessly in your Django applications. The Pillow library makes it easy to work with image sizes, and Django's validation system allows you to integrate custom logic without much effort.

Key Takeaways:

  • Use Pillow to extract image dimensions.
  • Raise ValidationError when an uploaded image fails your criteria.
  • Integrate validators into Django models to ensure data integrity.

By combining Django and Pillow, you can create powerful and flexible image upload rules that enhance the quality of your web applications.

Happy coding! 🚀

Top comments (0)