【Django学习笔记】11:对Models中图片、视频字段的处理

有时Models的字段需要使用图片、视频等文件存储。例如一个用户模型有头像,一个视频模型要有存视频的字段和存缩略图的字段。

配置MEDIA_ROOT的访问

urls.py中配置访问媒体资源的Path:

from django.views.static import serve
from django.urls import re_path
from .settings import MEDIA_ROOT

urlpatterns = [
    ......
    # 处理图片显示的url,使用Django自带serve,传入参数告诉它去哪个路径找,使用配置好的路径
    re_path('media/(?P.*)', serve, {"document_root": MEDIA_ROOT}),
]

在Model中相应字段的使用

用户头像

用户头像使用ImageField存储:

head_img = models.ImageField(upload_to="user_head/", null=True, blank=True, verbose_name="用户头像")

视频资源

视频不属于图片,使用更一般的文件字段来存储:

content = models.FileField(upload_to="videos/", null=True, blank=True, verbose_name="视频内容")

视频缩略图

和用户头像一样是图片字段:

thumb = models.ImageField(upload_to="video_thumb", null=True, blank=True, verbose_name="缩略图")

以上upload_to参数即是上传到的MEDIA_ROOT的子目录:
在这里插入图片描述
通常,这些内容不必提交到Git,但为了将目录提交上去(保障项目结构的清晰完整),可以为每个子目录添加.gitkeep占位文件,并像这样书写.gitignore

# 媒体资源
media/user_head/*
media/video_thumb/*
media/videos/*

# 保留含占位文件的目录
!.gitkeep

在删除Model时将它们删除

以视频Model的删除为例,只要使用Django的信号量拦截一下,在信号量文件中配置在删除对象前(pre_delete)将相应的资源删除即可。

videos/signals.py

from django.db.models.signals import pre_delete
from django.dispatch import receiver

from videos.models import Video


@receiver(pre_delete, sender=Video)
def delete_video_files(sender, instance=None, created=False, **kwargs):
    """Video对象删除前触发"""
    video = getattr(instance, 'content', '')  # 
    img = getattr(instance, 'thumb', '')  # 
    # 删除视频和缩略图
    video.delete(save=False)
    img.delete(save=False)

videos/apps.py

注意在这里引用信号量文件。

from django.apps import AppConfig


class VideosConfig(AppConfig):
    name = 'videos'
    verbose_name = "视频管理"

    def ready(self):
        import videos.signals

你可能感兴趣的:(#,Django)