【问题标题】:How to select a random file from a folder that where uploaded with django-filer如何从使用 django-filer 上传的文件夹中选择随机文件
【发布时间】:2018-02-21 18:58:12
【问题描述】:

我将 django-cms 用于一个项目,在前端(模板)中,我想从文件夹中选择一个随机图像。

媒体由 django-filer 管理。当我直接在模型中分配文件时,我知道如何使用这些文件,但我不知道是否以及如何选择随机图像。

为了更好地理解,我有一个可以选择图像的模型。如果编辑器没有设置,我想随机选择一张图片作为备份。

【问题讨论】:

  • 数据库中是否引用了随机图像?
  • 说实话,我不知道,我对 django 比较陌生。我可以说的是,我在 filer 中创建了文件夹,并用它上传了所有图像。由于我可以在文件管理器中编辑图像的元数据,我猜数据库中必须有某种引用。

标签: python django django-cms django-filer


【解决方案1】:

在您的设置中添加加载图像的媒体文件夹的路径。例如

RANDOM_IMAGES = '%s/fallback_images/' % MEDIA_ROOT

然后你可以创建一个模板标签,简单地列出媒体文件夹中的图像并随机取一张。

你的标签可能是这样的:

import random
import os
from django import template
from django.conf import settings

register = template.Library()

@register.simple_tag
def random_image():
    list_images = os.listdir(path=settings.RANDOM_IMAGES)
    return random.choice(list_images)

现在在您的模板中,您可以使用类似这样的内容

{% if mymodel.image %}
  ... do something with the image provided by the model
{% else %}
  use the tag `random_image`
{% endif %}

不确定,但您可以使用 default 实现相同的效果

{{ mymodel.image|default:random_image }}

查看有关模板标签以及如何构建它们的文档:https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

【讨论】:

  • 可能是我的设置有问题,但我通过文件管理器创建的文件夹不在 MEDIA_ROOT 文件夹中。这些文件以似乎基于哈希的文件夹结构组织。所以,不幸的是,这不起作用。
  • 你是对的,但是你可以从数据库中获取文件夹。看看这里的源代码:github.com/divio/django-filer/blob/develop/filer/models/…
  • 谢谢!这有帮助,我解决了我的问题。我会尽快发布。
【解决方案2】:

为了解决这个问题,我不得不使用文件管理器的文件夹模型。这是我的模型:

class HeroExtension(TitleExtension):

    image = FilerImageField(
        blank=True,
        null=True
    )

    def get_hero_image(self):
        if self.image:
            return self.image

        folder = Folder.objects.filter(name='Heros')
        if folder:
            file = random.choice(folder.first().files)
            if file:
                return file

        return None

首先,我返回模型的图像(如果已设置)。如果没有,我会查找特定文件夹并从中选择一个随机图像。

如果没有找到,我会返回None,否则会返回图像。

我的模板如下所示:

{% if request.current_page.get_title_obj.heroextension.get_hero_image %}
{% with hero_image=request.current_page.get_title_obj.heroextension.get_hero_image %}
<img class="hero__image"
     alt="{{ hero_image.default_alt_text }}"
     srcset="{{ hero_image|thumbnail_url:'hero-450' }} 800w,
             {{ hero_image|thumbnail_url:'hero-576' }} 1024w,
             {{ hero_image|thumbnail_url:'hero-768' }} 1360w,
             {{ hero_image|thumbnail_url:'hero-1080' }} 1920w"
     sizes="100vw"
     src="{{ hero_image|thumbnail_url:'hero-1080' }}">
{% endwith %}
{% endif %}

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多