'How can I apply a common validator to all text inputs in my Django form?

I want to apply a special character whitelist to all non-password user text inputs across my site, so that validation will fail if a non-whitelisted character is entered. All of my forms already inherit from a single base form class, which itself inherits from django.forms.BaseForm. How can I apply this validator to every relevant field on all the forms that inherit from this form?



Solution 1:[1]

Override the __init__ method on the base form class:

class ProjectBaseForm(forms.BaseForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields.values():
            if isinstance(field, forms.CharField) and not isinstance(field.widget, forms.PasswordInput):
                field.validators.append(validate_special_characters)
def validate_special_characters(text):
    if set(text) - set(CHAR_FIELD_ALLOWED_CHARACTERS):
        raise ValidationError(f"Invalid characters. Only the following special characters are allowed: {" ".join(VALID_SPECIAL_CHARACTERS}")    
from string import ascii_letters, digits

VALID_SPECIAL_CHARACTERS = ' "\'#&()+,-./:;@_?!\n'
CHAR_FIELD_ALLOWED_CHARACTERS = ascii_letters + digits + VALID_SPECIAL_CHARACTERS

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1