图像未出现在 Django 模板 For Loop 中

Posted

技术标签:

【中文标题】图像未出现在 Django 模板 For Loop 中【英文标题】:Images not appearing in Django template For Loop 【发布时间】:2021-11-02 21:29:03 【问题描述】:

See Problem Here

我想遍历 Django 中的静态图像目录。图像被正确循环,但我的 <img src /> 语法有问题。我在 flag 上尝试了许多变体,但无法正常工作。有人可以建议吗?

在 settings.py 我创建了以下 STATIC_ROOT 对象:

STATIC_ROOT = '/Users/TheUnforecastedStorm/Desktop/Code_projects/Portfolio_Site/portfolio_site/entrance/static'

在 views.py 中,我将此文件路径加入到我的图像目录中,并将图像列表放入上下文字典中。然后我在回复中加入了这本字典:

import os
from django.conf import settings
from django.shortcuts import render

# Create your views here.
def index(request):
    # Create a dictionary
    context = 

    # Join images directory to index.html view
    flags = os.listdir(os.path.join(settings.STATIC_ROOT, "entrance/images/"))  
    context['flags'] = flags
    
    # Return response
    return render(request, "entrance/index.html", context)

然后我在模板中循环遍历这些图像:

<!DOCTYPE html>
% load static %
<html>
    <head>
        <link rel="stylesheet" href="% static 'entrance/entrance.css' %">
        <script src="% static 'entrance/entrance.js' %" type="text/javascript"></script>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>

    <body>
        % for flag in flags %
            <img src=" flag "  />
        % endfor %
    </body>
</html>

【问题讨论】:

在我使用静态图像的模板中,我的源将使用静态模板标签。也许试试% static flag %之类的东西?编辑:我注意到的一个问题是os.listdir() 返回的flags 列表中的值将仅包含该路径中的项目名称,而不包含完整路径本身。因此,如果您尝试访问的图像位于 entrance/images 中,请尝试 % static 'entance/images/' flag % 首先检查你是否创建了正确的路径 - 因为 STATIC_ROOT..../entrance/static 广告你添加 entrance/images 所以你最终有 ..../entrance/static/entrace/images 。其他问题可能是服务器可能仅从STATIC_ROOT 发送图像,这意味着..../entrance/static/ 或其子文件夹 - 如果您尝试使用不同的文件夹,那么出于安全原因它将阻止文件。 @NathanRoberts 不错。我更新了那行代码以读取&lt;img src="% static 'entrance/images/' flag %" alt="problem" /&gt;,但仍然遇到同样的问题。我在 Chrome 中检查了该页面,可以看到请求 URL 将转到保存图像的正确目录:127.0.0.1:8000/static/entrance/images,它似乎正在访问它们,但由于某种原因不会显示它们。我在问题顶部添加了一个屏幕截图。 @furas 我仔细检查了我创建的路径是否正确。我在上面的检查模式下添加了页面的屏幕截图 - 它显示了目录的正确路径。我感觉到这是通过在 % static 'directory/file' % 上下文中访问 flag 的 Django 模板的问题,但我无法找出解决它的正确方法。 @Mark1 你能拍下其中一张图片的 html 在检查器中的样子吗?它似乎没有从您输入 src url 的 flag 获取文件名。也许尝试从 src 属性的 url 中的“flag”一词周围删除 【参考方案1】:

@Mark1 从上面处理我的 cmets,我无法找到任何东西来确认它,但似乎 % static % 模板标签只能采用一个额外的参数来创建路径,所以这是你的东西可以试试。

在你看来:

def index(request):
    # Create a dictionary
    context = 

    # Join images directory to index.html view
    flags = os.listdir(os.path.join(settings.STATIC_ROOT, "entrance/images/"))

    # ADD IN THIS LINE HERE
    flags = ['entrance/images/'+fl for fl in flags]


    context['flags'] = flags
    
    # Return response
    return render(request, "entrance/index.html", context)

我添加的行会将“entrance/images/”添加到您正在搜索的目录中所有文件名的开头。

然后在你的模板中

% for flag in flags %
   <img src="% static flag %"  />
% endfor %

让我知道这是否有效。

【讨论】:

这成功了!非常感谢你的帮助!昨晚我找到了一个解决方案,该解决方案通过遍历views.py 中的url 列表来接近,但我仍然无法完全得到我想要的东西。你对 django static 的洞察只允许一个额外的参数被证明是正确的。 太棒了,很高兴我能帮上忙

以上是关于图像未出现在 Django 模板 For Loop 中的主要内容,如果未能解决你的问题,请参考以下文章

图像未出现在 django 2.1 的模板中

如何动态地将 html 类添加到 Django 模板“for-loop”?

在 Django 中,我试图显示“for loop”的输出

Django For-Loop 和 Div ID

如何在 django 模板的 for 循环中加载图像?

媒体文件夹中的图像未显示 django 模板