【问题标题】:How to select a random image in a Django template?如何在 Django 模板中选择随机图像?
【发布时间】:2018-09-02 15:33:11
【问题描述】:

我目前在 Django 模板中有一个图像,我想在每次加载页面时随机选择它:

        <!--<img src="{% static 'images/640px-Waaah.jpg' %}"/>-->
        <img src="{% static 'images/Crying_Baby.jpg' %}"/>

我在 Github 上为此目的找到了一些自定义过滤器(例如 random_image),但在我看来,这应该可以使用内置标签,特别是 random 过滤器。

应该是这样的

{% with ['images/640px-Waaah.jpg', 'images/Crying_Baby.jpg']|random as crying_baby %}
  <img src="{% static crying_baby %}"/>
{% endwith %}

但我不认为这是有效的 DTL 语法。知道我会怎么做吗?

(顺便说一下,该页面是 Django 的默认 404.html 并且没有传递任何上下文,所以我更愿意通过将婴儿图像列表传递给上下文来实现)。

【问题讨论】:

    标签: html django django-templates


    【解决方案1】:

    正如你所说,Django 不允许你在模板中定义列表。

    您可以使用一串逗号分隔的值并编写自定义标签my_random,它会拆分字符串并选择其中一个值:

    {% with "image1.jpg,image2.jpg"|my_random as image%}
    

    或者你可以写一个split标签并将结果传递给内置的random标签。

    {% with "image1.jpg,image2.jpg"|split:","|random as image %}
    

    【讨论】:

    • 我真的很喜欢拆分和随机的巧妙技巧。获得我的 +1
    • @BurhanKhalid 它很优雅——但是 Django 没有带有split 标签的事实是一个非常强烈的暗示,即 DTL 设计者应该从模板中获取逻辑并编写random_image 你建议的标签。
    • 我最终在code.djangoproject.com/ticket/21367 中的标签后面写了一个split 标签。
    【解决方案2】:

    我会通过编写一个从选择中返回随机图像的标签来接近它:

    import random
    
    from django import template
    from django.conf import settings
    
    register = template.Library()
    
    @register.simple_tag
    def random_image():
        choices = getattr(settings,
                          RANDOM_IMAGE_LIST,
                          ['http://thecatapi.com/api/images/get?format=src&type=png'])
        return random.choice(choices)
    

    在模板中执行此操作的优势主要是重用,并且更容易更改选择,因为您只需在一个地方执行此操作,而不是寻找模板。

    我对其进行了一些改进,以便从settings.py 中的配置变量中提取列表,如果未设置,它将使用“默认”图像。

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 2023-03-18
      • 2014-01-28
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多