我正在编写一个Django应用程序,它需要一个Script对象,该对象既可以访问包含脚本的文件,也可以访问脚本的全文。脚本文件是一个xls文件,我在从中提取数据或以编程方式将数据写入其中时没有任何问题(xlrd和朋友很棒!),我将它存储在models.FileField中。我想将全文存储在models.TextField中,但我的问题是我不知道如何正确地将工作流放在一起,以便全文和存储的文件相互镜像。
我想要的工作流程:
创建脚本对象 - >文件上传到文件字段 - >从文件中提取的文本保存到全文字段
和
脚本全文编辑 - >文本字段中写回文件的文本 - >脚本已保存
和
脚本文件替换为新文件 - >从文件中提取的文本保存到全文字段
我一直在使用信号框架(presave和postave),但我不知道如何制作它,呃,保存我希望的更改,因为这需要调用save->生成无限循环。此外,似乎在上传文件之前调用了presave(使用表单),这让我的服务器对我不好。
有什么想法吗?
答案 0 :(得分:0)
事实证明我是在过度设计这个问题。我实际上寻找的信号是post_init,我写的函数实际上只是
@receiver(post_save, sender=Script)
def retrieve_fulltext(sender, **kwargs):
script = kwargs['instance']
s = open(script.script.path)
text = s.read()
if script.fulltext == text:
return else: script.fulltext = text
script.save()
仍然,是的,需要更多一点才能使其与全文中的更改一起触发对文件的写入。对不起,好吧,问一个愚蠢的问题。我希望这个答案至少对其他人有用。