Imagine a model like this:
class CFile(models.Model):
filepath = models.FileField(upload_to=...)
collection = models.ForeignKey("FileCollection",null=True)
... # other attributes that are not relevant
def clean(self):
bname = os.path.basename
if self.collection:
cfiles = self.baseline.attachment_set.all()
with_same_basename = filter(lambda e: bname(e.filepath.path) == bname(self.filepath.path),cfiles)
if len(with_same_basename) > 0:
raise ValidationError("There already exists a file with the same name in this collection")
class FileCollection(models.Model):
name = models.CharField(max_length=255)
files= models.ManyToManyField("CFile")
I want to disallow the upload of a CFile if there already exists a CFile with the same basename, that’s why I added the clean. The problem is:
- I upload a CFile, with the name
file1.png-> gets uploaded because no other files with this name exist - I upload another CFile, with the name
file1.png-> I get the expected error that I already have a file with this name. So, I try to change the file, and upload a file with a different name (file2.png). The problem is, I stopped via pdb in the clean, and the model instance is stillfile1.png. I imagine this happens because of my ValidationError and django allows me to “correct my mistake”. The problem is I cannot correct it if I cannot upload another file. How can I handle this?
EDIT: This happens in the admin area, sorry for forgetting to mention this before. I don’t have anything custom ( besides inlines = [ FileInline ] ).
I think the clearest way is to declare another field in your model for filename and make it unique for every collection. Like this: