Django自定义管理员方法处理上传文件

1 投票
1 回答
2492 浏览
提问于 2025-04-17 10:27

我正在尝试创建一个应用程序,它可以将视频文件发送到一个编码服务,然后再从这个编码服务发送到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中使用。

想了解更多关于信号的内容,可以去看看。

撰写回答