Finally figured out how to do this. The trick was also subclassing FieldFile in addition to FileField:
class LeadingSlashFieldFile(files.FieldFile):
def __init__(self, instance, field, name):
name = re.sub(r'^/', '', name)
super(LeadingSlashFieldFile, self).__init__(instance, field, name)
class LeadingSlashFileField(models.FileField):
attr_class = LeadingSlashFieldFile
def get_prep_lookup(self, lookup_type, value):
if hasattr(value, 'name'):
value = value.name
if value[0] <> '/':
value = "/" + value
return super(LeadingSlashFileField, self).get_prep_lookup(lookup_type, value)
def get_prep_value(self, value):
value = super(LeadingSlashFileField, self).get_prep_value(value)
if value is None:
return None
value = unicode(value)
if value[0] <> '/':
value = "/" + value
return value
This appears to work.