在 django 中加载带有变量名的静态文件

Posted

技术标签:

【中文标题】在 django 中加载带有变量名的静态文件【英文标题】:load static file with variable name in django 【发布时间】:2013-08-05 03:26:47 【问题描述】:

我正在尝试加载以下静态文件

 <a href="%static 'static/images/' image.title '.png' %">img file</a> 

其中image 位于从数据库派生的images 的for 循环中。

但我只是收到一个错误Could not parse the remainder: '' from ''static/matrices/''

我应该怎么做才能解决这个问题?我不能使用相对路径,因为这也将被小节使用,具有相同的 html 模板。

【问题讨论】:

您为什么将错误答案标记为正确? 【参考方案1】:

您可以使用get_static_prefix 模板标签。 get_static_prefix 是一个变量,其中包含在您的STATIC_URL 中指定的路径。你的代码是:

% load static %
<a href="% get_static_prefix %static/images/ image.title .png">img file</a>

% load static %
% get_static_prefix as STATIC_PREFIX %
<a href=" STATIC_PREFIX static/images/ image.title .png">img file</a>

参考:get_static_prefix

【讨论】:

【参考方案2】:

您应该将完整的字符串从静态文件传递给静态标签。这样它就可以使用您的静态存储来查找您的文件。

% load staticfiles %
% with 'images/'|add:image.title|add:'.png' as image_static %
  % static image_static %
% endwith %

但在您的用例中,将图像的路径存储在图像模型本身上可能会更好。

【讨论】:

欢迎来到 Stack Overflow!尽管此答案可能是正确且有用的,但如果您随附一些解释以解释它如何帮助解决问题,则最好。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。 如果您必须使用 javascript 设置背景图像,这也是最有效的方法:var backgroundImage = ' STATIC_PREFIX ' + filename + '.png';然后$('#selector').css('background-image', "url(" + backgroundImage + ")"); ehacinom 您实际上并没有阅读它吗?不,这不是如何在 javascript 中正确使用 django 静态标签【参考方案3】:

我最终做的只是将路径与名称本身分开。这些图像代表选项卡,是静态的并且是按顺序排列的。它们没有按图像连接到数据库。

我不想每次运行都重复 html,所以我最终做了一个这样的 forloop,有点简化。

% for option in options_obj %
   <img class="highlight" src="% static "store/img/editor/tab-" %
    option.name.lower -selected.png">
% endfor %

编辑: 尽管这在大多数情况下确实有效,但它也确实会搞砸事情。对我来说,当有不同的图像用于不同的语言设置并且同时使用像 CachedStaticFilesStorage 这样的工具时,就会发生这种情况。如果您需要在图像中添加语言代码或其他内容,这是一个更可靠的解决方案

% for option in options_obj %
    <img class="highlight" src="% static "store/img/editor/tab-"
    |add:LANGUAGE_CODE|add:"-selected.png" %">
% endfor %

【讨论】:

请注意,如果该项目在静态中不存在,则会出错【参考方案4】:

我通过对静态路径使用空字符串然后在它们自己的部分中使用我的变量来实现此功能,如下所示:

<a href= "% static "" %obj.a/obj.b/obj.c.gz" >Name</a>

【讨论】:

那么静态标签的意义何在?只需使用 STATIC_URL。静态标签用于当您有存储时,它可能会更改名称,例如散列存储会将 md5 哈希放在名称中。【参考方案5】:

你应该避免嵌套标签。

你想解决什么问题?图像不是动态内容的一部分吗?静态标签用于 static 内容未上传的媒体文件。

如果你必须使用静态标签,正确的方式应该是:

% static image % or % static image.file %

取决于对象布局。如果您使用的是ImageField(继承FileField),则图像对象已经包含路径,因此无需手动添加扩展。

【讨论】:

【参考方案6】:

引用过多!

只是

<a href="% static 'images/ image.title .png' %">img file</a> 

并且您不必在链接中调用静态,因为您已经加载了静态

【讨论】:

没关系......即使答案是正确的,你也会真的投反对票,只是为了看看你有更高的声誉。我不喜欢回答太多的解释,我喜欢直截了当地回答:) @HeddevanderHeide 你确定吗?你试过了吗?因为我已经尝试过很多次了。您的回答也是正确的,但很抱歉我们有不同的想法,您不能强迫人们对您的想法做出相同的判断。 嵌套标签不起作用,在模板标签的%-范围内,变量已经被视为这样,不需要周围的赞誉。这与个人恩惠无关,您的回答根本不正确。输出 html 将是:/&lt;static_prefix&gt;/images/ image.title .png 包括被视为字符串的荣誉。 刚试了下还是不行,结果中和被解释为%7B和%7D

以上是关于在 django 中加载带有变量名的静态文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中的 css 文件中加载静态文件

CSS静态文件未在Django中加载

自定义静态文件未在 django 项目中加载

DJANGO:静态文件未在实时服务器中加载(但在本地加载)?

在静态文件中加载图像

在 CPanel 中使用 Python 在 Django 管理面板中加载静态文件