Validators
Validators are callables that raise ValidationError when a value is invalid. They can be attached to model fields or form fields.
Using validators
Section titled “Using validators”from buraq.forms import Formfrom buraq.forms.fields import CharField, IntegerFieldfrom buraq.validators import MinLengthValidator, MaxValueValidator, RegexValidator
class SignupForm(Form): username = CharField(max_length=150, validators=[MinLengthValidator(3)]) age = IntegerField(validators=[MaxValueValidator(120)]) phone = CharField(validators=[RegexValidator(r"^\+?1?\d{9,15}$")])Built-in validators
Section titled “Built-in validators”MaxLengthValidator / MinLengthValidator
Section titled “MaxLengthValidator / MinLengthValidator”from buraq.validators import MaxLengthValidator, MinLengthValidator
MaxLengthValidator(200) # value must be ≤ 200 charactersMinLengthValidator(3) # value must be ≥ 3 charactersMaxValueValidator / MinValueValidator
Section titled “MaxValueValidator / MinValueValidator”from buraq.validators import MaxValueValidator, MinValueValidator
MaxValueValidator(100) # numeric value must be ≤ 100MinValueValidator(0) # numeric value must be ≥ 0RegexValidator
Section titled “RegexValidator”from buraq.validators import RegexValidator
phone = RegexValidator( regex = r"^\+?1?\d{9,15}$", message = "Enter a valid phone number.", code = "invalid_phone",)
# inverse_match=True — passes only when the value does NOT matchno_spaces = RegexValidator(r"\s", inverse_match=True, message="Spaces are not allowed.")EmailValidator
Section titled “EmailValidator”from buraq.validators import EmailValidator, validate_email
validate_email("alice@example.com") # OKvalidate_email("not-an-email") # raises ValidationErrorURLValidator
Section titled “URLValidator”from buraq.validators import URLValidator, validate_url
validate_url("https://example.com") # OKvalidate_url("not a url") # raises ValidationErrorSlugValidator / UnicodeSlugValidator
Section titled “SlugValidator / UnicodeSlugValidator”from buraq.validators import SlugValidator, UnicodeSlugValidator
SlugValidator() # letters, numbers, hyphens, underscoresUnicodeSlugValidator() # same but allows unicode lettersDecimalValidator
Section titled “DecimalValidator”from buraq.validators import DecimalValidator
v = DecimalValidator(max_digits=8, decimal_places=2)v("12345.99") # OKv("123456.789") # raises ValidationError — too many decimal placesvalidate_integer
Section titled “validate_integer”from buraq.validators import validate_integer
validate_integer("42") # OKvalidate_integer("abc") # raises ValidationErrorvalidate_ipv4_address / validate_ipv6_address / validate_ipv46_address
Section titled “validate_ipv4_address / validate_ipv6_address / validate_ipv46_address”from buraq.validators import validate_ipv4_address, validate_ipv6_address, validate_ipv46_address
validate_ipv4_address("192.168.1.1") # OKvalidate_ipv6_address("::1") # OKvalidate_ipv46_address("10.0.0.1") # OK — accepts both v4 and v6FileExtensionValidator
Section titled “FileExtensionValidator”from buraq.validators import FileExtensionValidator
v = FileExtensionValidator(allowed_extensions=["pdf", "docx"])v(upload_file) # raises ValidationError if not .pdf or .docxvalidate_image_file_extension
Section titled “validate_image_file_extension”from buraq.validators import validate_image_file_extension
# Accepts: .png, .jpg, .gif, .webp, .svg, .bmp, .tiff, .ico, .avif, .apngvalidate_image_file_extension(upload_file)StepValueValidator
Section titled “StepValueValidator”from buraq.validators import StepValueValidator
v = StepValueValidator(step=5)v(10) # OKv(11) # raises ValidationError — not a multiple of 5
# With offsetv2 = StepValueValidator(step=2, offset=1)v2(3) # OK (3-1=2, multiple of 2)ProhibitNullCharactersValidator
Section titled “ProhibitNullCharactersValidator”from buraq.validators import ProhibitNullCharactersValidator
v = ProhibitNullCharactersValidator()v("hello\x00world") # raises ValidationErrorBaseValidator
Section titled “BaseValidator”Base class for limit-value validators. Subclass and override compare and clean:
from buraq.validators import BaseValidator
class EvenValueValidator(BaseValidator): message = "Value must be even (got %(show_value)s)." code = "not_even"
def compare(self, value, limit): return value % 2 != 0
def clean(self, value): return int(value)int_list_validator
Section titled “int_list_validator”from buraq.validators import int_list_validator
v = int_list_validator(sep=",", allow_negative=False)v("1,2,3") # OKv("1,-2,3") # raises ValidationError — negatives not allowedv("1,abc,3") # raises ValidationError — not an integerWriting custom validators
Section titled “Writing custom validators”from buraq.exceptions import ValidationError
def validate_no_profanity(value: str) -> None: if "badword" in value.lower(): raise ValidationError("Profanity is not allowed.", code="profanity")Attach to a form field:
from buraq.forms.fields import CharField
name = CharField(validators=[validate_no_profanity])Convenience singletons
Section titled “Convenience singletons”from buraq.validators import validate_email, validate_slug, validate_unicode_slug, validate_url