如何从使用 django-filer 上传的文件夹中 select 随机文件
How to select a random file from a folder that where uploaded with django-filer
我在一个项目中使用 django-cms,在前端(模板)我想 select 从文件夹中随机获取一张图片。
媒体由 django-filer 管理。当我直接在我的模型中分配它们时,我知道如何使用这些文件,但我不知道是否以及如何 select 随机图像。
为了更好地理解,我有一个可以选择图像的模型。如果不是小编设置的,我想随机选一张图片做备份
在您的设置中添加加载图像的媒体文件夹的路径。例如
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/
为了解决这个问题,我不得不使用文件管理器的文件夹模型。这是我的模型:
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
首先我return模型的图像,如果设置的话。如果没有,我会寻找特定的文件夹,然后 select 从中随机获取一张图片。
如果什么都找不到,我 return None
在任何其他情况下都会 return 编辑图像。
我的模板是这样的:
{% 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 %}
我在一个项目中使用 django-cms,在前端(模板)我想 select 从文件夹中随机获取一张图片。
媒体由 django-filer 管理。当我直接在我的模型中分配它们时,我知道如何使用这些文件,但我不知道是否以及如何 select 随机图像。
为了更好地理解,我有一个可以选择图像的模型。如果不是小编设置的,我想随机选一张图片做备份
在您的设置中添加加载图像的媒体文件夹的路径。例如
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/
为了解决这个问题,我不得不使用文件管理器的文件夹模型。这是我的模型:
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
首先我return模型的图像,如果设置的话。如果没有,我会寻找特定的文件夹,然后 select 从中随机获取一张图片。
如果什么都找不到,我 return None
在任何其他情况下都会 return 编辑图像。
我的模板是这样的:
{% 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 %}