嗨,我还是Django和Python的新手,我对API有了解,所以我完全有可能错过一些明显的东西。
我通过FileField
(Django)的forms.Form
收到一个文件。因此设法获得InMemoryUploadedFile
的实例。此表单未链接到模型。
在将文件放入模型并保存之前(我正在使用S3BotoStorage),我想更改文件名并加密文件内容(现在它真的没什么特别的,我还在测试它。)
我不明白的是如何访问文件的文件名和数据内容并覆盖它?或者创建我InMemoryUploadedFile
的修改后的实例。
我想过使用这样的东西,但显然它不起作用。
def encrypt(inMemFile, key):
assert isinstance(inMemFile, InMemoryUploadedFile)
secret = m2secret.Secret()
secret.encrypt(inMemFile.read(), key)
inMemFile.file = File(secret.serialize(), uuid.uuid4().get_hex())
return inMemFile
答案 0 :(得分:1)
您可以将File
实例分配给模型字段。这样的事情应该有效:
obj = form.save(commit=False)
# [...] your encryption stuff [...]
obj.some_file_field = ContentFile(secret.serialize(), uuid.uuid4().get_hex())
obj.save()
form.save_m2m()
另请参阅Django文档中Handling uploaded files with a model部分的第二个示例。
请注意,较大的文件不会在内存中处理;它们是TemporaryUploadedFile
个实例。