【问题标题】:django templates upload file - how to handle a non-existant physical filedjango模板上传文件-如何处理不存在的物理文件
【发布时间】:2015-04-25 13:47:38
【问题描述】:

我正在使用 django 将图像文件上传到服务器。

当用户尝试在 django 模板中查看丢失的图像时,只显示损坏的图像,但我想显示默认的丢失图像文件。

如何处理物理文件被删除(或只是丢失)但位置仍存储在数据库中的可能性?

【问题讨论】:

    标签: python django django-templates django-file-upload


    【解决方案1】:

    使用文件存储的exists()方法。例如,如果图像字段的名称是image,代码将如下所示:

    if obj.image.storage.exists(obj.image.name):
        ...
    

    为了简化事情,您可以创建一个custom template filter

    from django.conf import settings
    
    @register.filter
    def default_image(image, default_file):
        if image.storage.exists(image.name):
            return image.url
        return settings.STATIC_URL + default_file
    

    然后在模板中直接使用:

    <img src="{{ obj.image|default_image:'no-image.png' }}" />
    

    【讨论】:

    • catavaran,我收到错误消息'str' object has no attribute 'storage'。我必须在过滤器文件中包含什么导入语句?另外,我将@register.simple_tag 更改为@register.filter()。我在正确的轨道上吗?
    • 对不起,当然应该是@reguster.filter。至于'str' object... 错误,我怀疑您将错误的属性传递给过滤器。请显示出现此错误的模板片段。
    • 只是为了确定:您应该将图像或文件对象传递给模板过滤器,而不是文件名。
    • 实际上我一直遇到模板代码问题,因为模板变量中的 {{STATIC_URL}} 变量(我不知道如何构造它)如下所示:&lt;img src="{{ attachment_detail.attachment_document.url|default_image:'{{ STATIC_URL }}img/attachments/attachment_not_uploaded.png' }}" /&gt;
    • 删除变量的url 部分并在模板过滤器中添加STATIC_URL,如我的示例:{{ attachment_detail.attachment_document|default_image:'img/attachments/attachment_not_uploaded.png' }}
    【解决方案2】:

    使用python检查文件对象

    file_obj = Model.objects.get(id=1)
    
    if os.path.exists(file_obj.file):
        file_path = file_obj.file
    else:
        file_path = default_path
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      相关资源
      最近更新 更多