2017-09-13 9 views
0

私はプロジェクトとフロントエンド(テンプレート)でdjango-cmsを使用しています。django-filerでアップロードされたフォルダからランダムなファイルを選択する方法

メディアはdjango-filerによって管理されます。モデルで直接ファイルを割り当てるときにファイルを使用する方法はわかっていますが、ランダムなイメージを選択できるかどうか、どのように選択できるかはわかりません。

わかりやすいように、画像を選択できるモデルがあります。それがエディタで設定されていない場合は、ランダムなイメージをバックアップとして選択します。

+0

はDBで参照ランダム画像ですか? –

+0

私は正直言ってわかりません、私はdjangoに比較的新しいです。私が言うことができるのは、私はファイラーにフォルダを作成し、それを使ってすべての画像をアップロードしたということです。ファイラーのイメージのメタデータを編集できるので、DBに何らかのリファレンスがなければならないと思います。 – thomas

答えて

0

これを解決するには、ファイラーのFolderモデルを使用する必要がありました。これは私のモデルです:

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 

次に、メディアフォルダ内の画像を一覧表示してランダムに撮影するテンプレートタグを作成できます。

あなたのタグは、このようなものが考えられます。そして、あなたはこの

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

わからないようなものを使用することができますが、あなたはdefault

を使用して同じことを達成することができ、あなたのテンプレートで今

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) 

{{ 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

関連する問題