Как обновить данные 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)
Продублируйте из этого ответа: ссылка