Как обновить данные FileField только если выбран новый файл в django или удалить предыдущий файл перед загрузкой нового

Мне нужна ваша помощь ... У меня такой же вопрос, но с другим специфическим классом... Мне нужно удалить предыдущий файл перед обновлением нового только если поле заполнено ... Если нет изменений в файле ... 1- Когда я обновляю файл с новой картинкой ... все нормально, но создается новый файл с некоторыми символами (moto.jpg > moto_msi2Kup.jpg) ... 2- Когда я обновляю только с новым именем (без изменений в файле) ... поле изображения в базе данных меняется ... раньше это было word/moto.jpg ... после обновления оно меняется на moto.jpg (мы потеряли информацию о директории word ...

)

Надеюсь, вы поняли мои потребности ... в обоих случаях мне нужно, чтобы поле изображения не изменялось, если FileField пустое .... Если поле FileField изменено ... Удалить предыдущий файл и загрузить новый (с тем же именем) Ниже views, models и forms.py и скриншот тоже ... Спасибо за помощь ;)

views.py

def updateWord(request, pk):
    word = Word.objects.get(id=pk)
    form = WordForm(instance=word)
    if request.method == 'POST':
        form = WordForm(request.POST, request.FILES, instance=word)
        if form.is_valid():
            document = form.save(commit=False)
            document.name = request.POST['name']
            # if not form.data['image'] is None:
            if request.FILES.get('image'):
                print("On supprime le fichier")
                word.delete_file()
            document.save()
            message = "Mot ["+request.POST['name'] + "] edité avec succès !"
            messages.success(request, message)
            return redirect('games:word')

    context = {'form': form}
    return render(request, 'games/createWord.html', context)

models.py

class Word(models.Model):
    objects = models.Manager()
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, unique=True, blank=True)
    level = models.IntegerField(default=1)
    image = models.FileField(upload_to='word/')
    group = models.ForeignKey(Group, null=True, blank=True, on_delete=models.SET_NULL)

forms.py

class WordForm(ModelForm):

    class Meta:
        model = Word
        fields = ('name', 'level', 'image', 'group')

Нажмите здесь, чтобы увидеть мой скриншот для UpdateForm

Используйте пользовательский метод сохранения в вашей модели:

def save(self, *args, **kwargs):
    try:
        this = Word.objects.get(id=self.id)
        if this.image != self.image:
            this.image.delete()
    except: pass
    super(Word, self).save(*args, **kwargs)

Таким образом, ваша модель будет выглядеть следующим образом:

class Word(models.Model):
    objects = models.Manager()
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, unique=True, blank=True)
    level = models.IntegerField(default=1)
    image = models.FileField(upload_to='word/')
    group = models.ForeignKey(Group, null=True, blank=True, on_delete=models.SET_NULL)

    def save(self, *args, **kwargs):
      try:
          this = Word.objects.get(id=self.id)
          if this.image != self.image:
              this.image.delete()
      except: pass
      super(Word, self).save(*args, **kwargs)

Продублируйте из этого ответа: ссылка

Вернуться на верх