Django 如何从文件路径中删除settings.MEDIA\u根目录

Django 如何从文件路径中删除settings.MEDIA\u根目录,django,python-3.x,Django,Python 3.x,我有一段代码,可以在上传视频时为其创建缩略图-看起来如下所示: views.py发布方法: if form.instance.thumbnail == 'images/clearpath_logo/Logo.jpg': thumb_title = form.instance.title.replace(" ", "") in_path = str(settings.MEDIA_ROOT) + "/" + str(form.instance.video_file) out_

我有一段代码,可以在上传视频时为其创建缩略图-看起来如下所示:

views.py发布方法:

if form.instance.thumbnail == 'images/clearpath_logo/Logo.jpg':
    thumb_title = form.instance.title.replace(" ", "")
    in_path = str(settings.MEDIA_ROOT) + "/" + str(form.instance.video_file)
    out_path = str(settings.MEDIA_ROOT) + "/images/" + thumb_title + ".png"
    if create_thumbnail(in_path, out_path):
        form.instance.thumbnail = "images/" + thumb_title + ".png"
其中
create_thumbnail
是帮助函数。。看起来是这样的:

def create_thumbnail(input_path, output_path):
    """
    Save first frame of video for use as video thumbnail.

    :param input_path: video input path
    :param output_path: image output path
    :return: Boolean
    """
    cap = cv2.VideoCapture(input_path)
    ret, frame = cap.read()
    if ret:
        return cv2.imwrite(output_path, frame)
    else:
        pass

我主要关心的是从每个文件路径中删除
设置.MEDIA\u ROOT
。如何避免手动键入文件路径?或者有没有一种方法可以让helper函数变成一个表单方法,并直接调用表单实例url?我想清理这段代码。

根据您提供的信息,请记住,我对任何表单都一无所知,也不知道cv2有什么作用,我可以这样整理:

def create_thumbnail(video_file, title):
    """
    Save first frame of video for use as video thumbnail.

    :param video_file: video file from the form instance
    :param title: the title of the thumbnail
    :return: path to the thumbnail
    """
    in_path - f'{settings.MEDIA_ROOT}/{video_file}'
    out_path = f'{settings.MEDIA_ROOT}/images/{title}.png'

    cap = cv2.VideoCapture(input_path)
    ret, frame = cap.read()
    if ret:
        image = cv2.imwrite(output_path, frame)
        if image:
            return out_path
    return ''


if form.instance.thumbnail == 'images/clearpath_logo/Logo.jpg':
    thumb_title = form.instance.title.replace(" ", "")
    form.instance.thumbnail = create_thumbnail(form.instance.video_file, thumb_title)    

注意,您的代码根本无法处理将视频文件命名为与其他人相同的人。缩略图将被覆盖。一个简单的解决方案是给缩略图一个随机名称。

为什么不更改
创建缩略图
,只获取
视频文件
,然后处理
create\u thumboil
中的所有逻辑,然后返回输出路径。OpenCV
VideoCapture
方法采用URL。我曾尝试使用
form.instance.video\u file.URL
,但这并没有给媒体提供支持。我说的是传入
form.instance.video\u file
。并在函数中使用
settings.MEDIA\u ROOT
作为前缀。我知道的重复文件名(在列表中是下一个)。感谢您花时间写下如此详细的回复。我希望有一种方法不必在任何地方手动编写
设置.MEDIA\u ROOT
。虽然你的代码看起来好了一点,但我仍然不太满意我希望我能在哪里使用它。什么是
settings.MEDIA\u ROOT
form.instance.video\u file