django filefield重命名问题

时间:2018-06-21 01:08:12

标签: django django-models django-forms django-file-upload

我正在使用以下代码来重命名通过表单上传的模型中FileField的文件名路径:


class Document(models.Model):
    document_date = models.DateField(null=True)
    document_category = models.CharField(null=False, max_length=255, choices=DOCUMENT_CATEGORY_CHOICES)
    document = models.FileField(upload_to='documents/', max_length=100)

    def save(self, *args, **kwargs):
        ext = os.path.splitext(self.document.name)[1]
        date = str(self.document_date).replace('-', '')
        category = self.document_category
        self.document.name = '%s_%s%s' % (date, category, ext)
        super().save(*args, **kwargs)

这对于创建的新记录效果很好,但是当我使用表单更新这些记录时,该记录会保存有新的更新详细信息(日期和/或类别),并且我的数据库反映了新的文件名路径,但是文件夹中的实际文件未更新。

有人能阐明我要去哪里以及如何解决这个问题吗?任何帮助深表感谢!

1 个答案:

答案 0 :(得分:0)

这是因为save()方法在每次更新操作时都会调用

我从OP中了解到,在两种情况下,您只需要save()方法,
1.创建新条目时
2. document字段发生更改/更新时。
因此,请尝试如下更改save()

class Document(models.Model):
    document_date = models.DateField(null=True)
    document_category = models.CharField(null=False, max_length=255, choices=DOCUMENT_CATEGORY_CHOICES)
    document = models.FileField(upload_to='documents/', max_length=100)

    def save(self, *args, **kwargs):
        if not self.id or not Document.objects.get(id=self.id).document == self.document:
            ext = os.path.splitext(self.document.name)[1]
            date = str(self.document_date).replace('-', '')
            category = self.document_category
            self.document.name = '%s_%s%s' % (date, category, ext)
        super().save(*args, **kwargs)