如何在Django中的视图之间传递对象

问题描述 投票:0回答:2

我有以下模型让我的学生将他们的任务上传到我正在创建的应用程序,但我有一个问题,我需要在视图之间传递模型的实例,但由于它不可序列化,我无法保存它在会话属性中。请记住,在一个视图中,我创建对象而不将其保存在数据库中,另一个视图中我使用对象执行操作,最后保存它。知道我怎么能这样做吗?

from gdstorage.storage import GoogleDriveStorage

gd_storage = GoogleDriveStorage()

class Homework(models.Model):
    code = models.AutoField(primary_key=True)
    student = models.ForeignKey('Student', on_delete=models.PROTECT)
    title = models.CharField(unique=True, max_length=100)
    attached_file = models.FileField(upload_to='files/homeworks/', validators=[validate_file_size], storage=gd_storage)
python django google-drive-sdk filefield
2个回答
2
投票

正如@dirkgroten所说,您可以在模型中添加一个名为status的附加字段,默认情况下为其指定临时值。除此之外,您还可以查看package code

最后删除Google云端硬盘中的文件作为存储后端非常简单。使用以下内容

gd_storage.delete(name_file)

所以改变@dirkgroten的代码

from django.core.files.storage import default_storage

@receiver (post_delete, sender=Homework)
def remove_file (sender, instance, **kwargs):
    if instance.attached_file is not None:
        gd_storage.delete(instance.attached_file.name)

2
投票

在视图之间保持“状态”的唯一方法是保存到数据库(或其他永久存储器)。那是会议为你做的。

如果您无法序列化以保存在会话中,那么除了将临时对象保存到数据库之外别无选择。您可以将其标记为临时并添加时间戳。并在下一个视图中将其标记为已提交。如果需要,偶尔清理,删除旧的临时对象。

要使用旧临时对象删除关联文件,可以为post_delete信号添加信号处理程序:

from django.core.files.storage import default_storage

@receiver(post_delete, sender=Homework)
def remove_file(sender, instance, **kwargs)
    path = instance.attached_file.name
    if path:
        default_storage.delete(path)
© www.soinside.com 2019 - 2024. All rights reserved.