Python 根据上传文件的类型,如何在Django模板中显示视频或图像文件?

Python 根据上传文件的类型,如何在Django模板中显示视频或图像文件?,python,html,django,django-templates,Python,Html,Django,Django Templates,我试图显示模型实例外键集中的文件。该文件可以是视频或图片,由用户上传,用户认为与Instagram类似。如何根据上载的文件类型将文件显示为或正确显示 我目前正在使用html中的或标记来显示文件,它们都可以工作,但前提是文件的类型合适。如果文件属于其他类型,则不正确的标记将在站点上显示一个黑框 预期结果是,如果用户上传的文件是视频文件,则将其显示为视频文件;或者,如果文件是图像文件,则将其显示为图像。相反,我目前只能在其中一个文件正确显示,而另一个文件显示为黑盒时显示这两种文件类型。我建议检查mi

我试图显示模型实例外键集中的文件。该文件可以是视频或图片,由用户上传,用户认为与Instagram类似。如何根据上载的文件类型将文件显示为或正确显示

我目前正在使用html中的或标记来显示文件,它们都可以工作,但前提是文件的类型合适。如果文件属于其他类型,则不正确的标记将在站点上显示一个黑框


预期结果是,如果用户上传的文件是视频文件,则将其显示为视频文件;或者,如果文件是图像文件,则将其显示为图像。相反,我目前只能在其中一个文件正确显示,而另一个文件显示为黑盒时显示这两种文件类型。我建议检查mime类型

假设你有一个叫媒体的模型:

{% if result.resultfile_set.all %}
    {% for resultfile in result.resultfile_set.all %}
        <video controls>
            <source src="{{ resultfile.file.url }}">
        </video>
        <img src="{{ resultfile.file.url }}" />
        <p>Caption: {{ resultfile.caption }}</p>
    {% endfor %}
{% endif %}

现在,您可以在模板中使用generate_html方法

您可以将媒体类型与url一起发送,并使用条件呈现来显示适当的媒体

class Media(models.Model):
    media = models.BinaryField(...)

    def generate_html(self):
        if mime_type(self.media) == "image":
            return <img></img>
        elif mime_type(self.media) == "video":
            return <video></video>
        else: 
            raise Exception("media type not understood")

别担心,如何在Django模板中显示视频或图像文件,我有答案

使用下面的代码

[{
    file: {
        type: "image",
        url: "example.com/foo.png"
    },
    caption : "foo"
}, 
{
    file: {
        type: "video",
        url: "example.com/bar.mp4"
    },
    caption : "bar"
}]

我尝试了很多方法,最后最好的解决方案是:

型号:

{% for msg in post_user %}
{% if msg.p_image_path.url|slice:"-4:" == ".mp4" %} 

#use video tag 
{% else %} 

#use image tag
{% endif %}
{% endfor %}
在模板中,您可以访问以下类型:

from mimetypes import guess_type

class Post(models.Model):
    media = models.FileField()

    def media_type_html(self):
    """
    guess_type returns a tuple like (type, encoding) and we want to access
    the type of media file in first index of tuple
    """
    type_tuple = guess_type(self.media.url, strict=True)
    if (type_tuple[0]).__contains__("image"):
        return "image"
    elif (type_tuple[0]).__contains__("video"):
        return "video"
from mimetypes import guess_type

class Post(models.Model):
    media = models.FileField()

    def media_type_html(self):
    """
    guess_type returns a tuple like (type, encoding) and we want to access
    the type of media file in first index of tuple
    """
    type_tuple = guess_type(self.media.url, strict=True)
    if (type_tuple[0]).__contains__("image"):
        return "image"
    elif (type_tuple[0]).__contains__("video"):
        return "video"
 {% if post.media_type_html == "image" %}
    <img src="{{ post.media.url }}">
 {% elif post.media_type_html == "video" %}
    <video controls>
       <source src="{{ post.media.url }}">
    </video>
 {% endif %}