Django自定义管理员方法处理上传文件
我正在尝试创建一个应用程序,它可以将视频文件发送到一个编码服务,然后再从这个编码服务发送到AWS的存储桶。这意味着我需要让文件可以被一个处理上传的功能访问,并在保存对象之前更新文件位置的链接。
上传到编码器的过程会返回一些JSON格式的信息,告诉我是否有错误或者成功。我在网站的客户端测试这个过程时没有遇到问题,但我不太确定如何在Django的管理后台实现这个功能。
我查看了文档,发现了ModelAdmin.add_view()。但我不确定如何获取上传文件的名称和路径,因为这对于上传到编码器的功能是必需的。
我意识到,最好是在整个过程完成后再保存其他信息,因为编码器会发送一个回调。
我该如何访问上传的文件,以便对其运行编码功能?有没有办法在服务收到回调时保存所有其他信息?
编辑:
应要求提供一个事件时间线/流程。
目前在前端的工作流程是这样的:
- 文件被上传
- file_upload_handle检查文件大小和时长
- 文件被上传到编码器(在上传过程中,编码服务会发送带有状态信息的JSON)
- 编码器将文件发送到AWS,并在成功时向服务器发送回调
我想确保上传到编码器的过程是在models.py之外进行的,因为它会在JSON响应中返回一些重要信息,这些信息可以用来抛出错误。
1 个回答
3
可能更好的做法是创建一个自定义存储。
如果你只是想重写管理界面的保存功能,那么你应该重写save_model()这个方法:
def save_model(self, request, obj, form, change):
"""
Given a model instance save it to the database.
"""
# your custom stuff here, this is the file path, change "upload_field_name"
# by your actual FileField name
obj.upload_field_name.path
obj.save()
这段代码来自于django/contrib/admin/options.py
,这里面有很多你可以重写的方法。
或者,你可以把一个函数连接到预保存信号,像这样:
from django.db.models import signals
def encode_upload(sender, instance=None, created=None, **kwargs):
# your custom stuff here, this is the file path, change "upload_field_name"
# by your actual FileField name
instance.upload_field_name.path
# change YourModelClass by the name of your actual model class
signals.pre_save.connect(encode_upload, sender=YourModelClass)
这样会在保存你的模型类的实例之前调用encode_upload
。无论是在管理界面,还是在其他视图中,只要调用save()的地方,都会触发这个函数。
请注意,信号槽(连接到信号的函数/回调)应该在网站启动时进行连接。比如可以在models.py
中使用。
想了解更多关于信号的内容,可以去看看。