2017-09-13 101 views
0

上傳我使用Django-CMS的一個項目,並在前端(模板)我想從一個文件夾中選擇一個隨機圖像的文件夾的隨機文件。如何選擇從哪裏Django的文件管理器

媒體是由Django的文件管理器進行管理。我知道如何在我的模型中直接指定文件時使用這些文件,但我無法弄清楚是否以及如何選擇隨機圖像。

爲了更好地理解,我有一個模型,在那裏我可以選擇圖像。如果這不是編輯設置的,我想選擇一個隨機圖像作爲備份。

+0

是在數據庫中引用的隨機圖像? –

+0

我不知道說實話,我對django比較陌生。我可以說的是,我在filer中創建了文件夾,並且用它上傳了所有圖像。因爲我可以在Filer中編輯圖像的元數據,所以我想在數據庫中必須有某種參考。 – thomas

回答

0

爲了解決這個問題,我不得不使用文件管理器的文件夾模式。這是我的型號:

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 %} 
0

在你設置的路徑添加到圖像加載的媒體文件夾。例如

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/

+0

也許這是我的設置的問題,但通過文件管理器創建的文件夾不存在於MEDIA_ROOT文件夾中。這些文件被組織在似乎基於哈希的文件夾結構中。所以,這不起作用。 – thomas

+1

你是對的,但你可以從數據庫中獲取文件夾。看看這裏的源代碼:https://github.com/divio/django-filer/blob/develop/filer/models/foldermodels.py –

+1

謝謝!這有助於我解決了我的問題。我會盡快發佈。 – thomas