Невозможно изменить экземпляр модели после появления ошибки ValidationError в административной области django - PullRequest
1 голос
/ 28 ноября 2011

Представьте себе такую ​​модель:

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")

Я хочу запретить загрузку CFile, если уже существует CFile с тем же базовым именем, поэтому я добавил clean.Проблема:

  • Я загружаю CFile с именем file1.png -> загружается, потому что других файлов с таким именем не существует
  • Я загружаю другой CFile с именемfile1.png -> Я получаю ожидаемую ошибку, что у меня уже есть файл с этим именем.Итак, я пытаюсь изменить файл и загрузить файл с другим именем (file2.png).Проблема в том, что я остановился через pdb в чистом виде, а экземпляр модели все еще file1.png.Я полагаю, что это происходит из-за моей ошибки ValidationError, и django позволяет мне «исправить мою ошибку».Проблема в том, что я не могу исправить это, если я не могу загрузить другой файл.Как я могу справиться с этим?

РЕДАКТИРОВАТЬ: Это происходит в административной области, извините за забыв упомянуть об этом раньше.У меня нет ничего кастомного (кроме inlines = [ FileInline ]).

1 Ответ

1 голос
/ 28 ноября 2011

Я думаю, что самый простой способ - объявить другое поле в вашей модели для имени файла и сделать его уникальным для каждой коллекции. Как это:

class CFile(models.Model):
   filepath   = models.FileField(upload_to=...)
   collection = models.ForeignKey("FileCollection",null=True, related_name='files')
   filename = models.CharField(max_length=255)
   ... # other attributes that are not relevant

    class Meta:
        unique_together = (('filename', 'collection'),)

    def save(self, *args, **kwargs):
        self.filename = bname(self.filepath.path)
        super(CFile, self).save(args, kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...