我正在编写一个Django应用程序,它需要一个Script对象,该对象可以访问包含脚本和脚本全文的文件。脚本文件是一个xls文件,我从中提取数据或以编程方式向其中写入数据都没有问题(xlrd和朋友们都很棒!),我将其存储在模型中。文件字段。我想把全文存储在模型中。TextField,但我的问题是,我不知道如何正确地将工作流组合在一起,以便全文和存储的文件相互镜像。
我想要的工作流:
脚本对象创建->文件上传到文件字段->从文件中提取的文本保存到全文字段
和
脚本全文编辑->文本写回文件字段中的文件->脚本保存
和
用新文件替换脚本文件->从保存到全文字段的文件中提取的文本
我一直在玩信号框架(presave和postsave),但我不知道如何进行,呃,保存我希望的更改,因为这需要调用save->生成一个无限循环。此外,在文件上传之前(使用表单)似乎会调用presave,这让我的服务器对我感到恶心
有什么想法吗?
事实证明,我对这个问题的设计过度了。我实际上在寻找的信号是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()
是的,这仍然需要更多的内容来处理全文中的更改,从而触发对文件的写入。抱歉,所以,问了一个愚蠢的问题。我希望这个答案至少对其他人有用。