【问题标题】:How to update FileField data only if a new file has been chosen in django or to delete previous one before upload new one仅当在 django 中选择了新文件或在上传新文件之前删除以前的文件时如何更新 FileField 数据
【发布时间】:2021-10-05 09:43:52
【问题描述】:

我需要你的帮助......我有同样的问题,但有另一个特定的课程......我的需要是在更新新文件之前删除以前的文件,只有当字段被填写时......如果文件没有变化。 .. 1-当我用新的图片文件更新时...没关系,但它创建了一个带有一些字符的新文件(moto.jpg > moto_msi2Kup.jpg)... 2-当我只用新名称更新时(没有改变文件)...数据库中的图像字段更改...以前是word/moto.jpg ...更新后更改为moto.jpg(我们丢失了word目录信息...

我希望你理解我的需求......在这两种情况下,如果 FileField 为空,我需要取消更改图像字段......如果 FileField 被更改......删除以前的文件并上传新文件(仍然具有相同的名称)下面的视图, models 和 forms.py 以及屏幕截图...感谢您的帮助;)

这是我的问题的视频

Youtbe Video of my issue

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

Click here to see my screenshot for UpdateForm

【问题讨论】:

    标签: python django


    【解决方案1】:

    在您的模型上使用自定义保存方法:

    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)
    

    复制此答案:link

    【讨论】:

    • 谢谢,但它并不能完全满足我的需求:(我遇到的问题是我只修改示例名称(不是 ImageField 中的图像)......图像字段从 word/nom 更改.png 到 nom.png ...在上传新图像之前删除旧图像似乎没问题...但是对于仅更新信息而不选择任何图像...它不会:(
    猜你喜欢
    • 2022-09-23
    • 2017-06-05
    • 2014-08-09
    • 2022-07-15
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    相关资源
    最近更新 更多