from django.forms import fields from django.core.validators import URL_VALIDATOR_USER_AGENT from oscar.core import validators class ExtendedURLField(fields.URLField): """ Custom field similar to URLField type field, however also accepting and validating local relative URLs, ie. '/product/' """ def __init__(self, max_length=None, min_length=None, verify_exists=False, validator_user_agent=URL_VALIDATOR_USER_AGENT, *args, **kwargs): # intentionally skip one step when calling super() super(fields.URLField, self).__init__(max_length, min_length, *args, **kwargs) validator = validators.ExtendedURLValidator( verify_exists=verify_exists, validator_user_agent=validator_user_agent) self.validators.append(validator) def to_python(self, value): # We need to avoid having 'http' inserted at the start of # every value if value and value.startswith('/'): return value return super(ExtendedURLField, self).to_python(value)