Django вернуть разные изображения - PullRequest
0 голосов
/ 26 марта 2020
  • У меня есть сетка 3 x 3, и я пытаюсь вернуть случайно выбранные изображения, отличные от данного каталога.

  • В настоящее время я получаю изображения в качестве выходных данных, но некоторые из них повторяются.

  • Всего в каталоге 10 изображений с цифровым названием.

  • Снимок экрана Токового выхода: Выход


Что я должен сделать, чтобы получить отдельные изображения в качестве моего вывода?

PS: я новичок в Django, поэтому любая помощь будет принята с благодарностью.


random_Image.py - Тег шаблона, возвращающий список выбранных изображений

@register.simple_tag
def random_image(image_dir):
    valid_extensions = ['.jpg', '.jpeg', '.png', '.gif']
    rand_dir = '/static/app_pickfeel/images/'
    # print(rand_dir)
    files = [f for f in os.listdir(settings.BASE_DIR + '/app_pickfeel/static/app_pickfeel/images')
             if f[f.rfind("."):len(f)] in valid_extensions]

    remove_duplicate = set(files)
    final_list = list(remove_duplicate)

    return rand_dir + random.choice(final_list)

random_Image.py: вывод для «файлов»

{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}
{'2.gif', '5.jpg', '6.jpg', '1.jpg', '9.jpg', '8.jpg', '4.jpg', '7.jpeg', '3.jpg'}

random_Image.py - вывод для «random.choice (final_list)» '

1.jpg
3.jpg
2.gif
6.jpg
9.jpg
9.jpg
7.jpeg
2.gif
8.jpg
8.jpg
1.jpg
7.jpeg
3.jpg

pickfeel. html - * Где используется тег шаблона (показано 1 строка, всего 3 строки)

<!--Row 1-->
        <div class="row no-pad display-flex  my-row">
            <div class="col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col-xl-4 col-xl-4 col-lg-4 col-md-4 col-sm-4 col-4 my-col-lg-4 col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col-md-4 col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col-sm-4 col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col- my-col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col">
                <img class="img-thumbnail" src="{{ MEDIA_URL}}{% random_image 'app_pickfeel/images/' %}">
            </div>
            <div class="col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col my-col-xl-4 col-lg-4 col-md-4 col-sm-4 col-4 my-col">
                 <img class="img-thumbnail" src="{{ MEDIA_URL}}{% random_image 'app_pickfeel/images/' %}">
            </div>
            <div class="col-xl-4 col-lg-4 col-md-4 col-sm-4 col- my-col my-col-xl-4 col-lg-4 col-md-4 col-sm-4 col-4 my-col">
                 <img class="img-thumbnail" src="{{ MEDIA_URL}}{% random_image 'app_pickfeel/images/' %}">
            </div>
        </div>

* 105 2 * views.py
def pickfeelhome(request):

    context = {}

    return render(request, 'app_pickfeel/pickfeel.html', context)

1 Ответ

1 голос
/ 26 марта 2020

Каждый вызов вашего тега выберет одно случайное изображение из десяти существующих. Так как эти вызовы полностью независимы, код тега не может знать, какое изображение было возвращено предыдущим вызовом (и даже если был какой-либо предыдущий вызов).

Самое простое решение - заставить ваш тег возвращать список изображения, сохраните этот список в шаблонар, а затем выполните итерации по нему:

@register.simple_tag
def random_images(count=3):
    valid_extensions = ('.jpg', '.jpeg', '.png', '.gif')
    # NB: 
    # 1. you should use `os.path.join()` to create your file path
    # 2. you shoudn't hard code this path
    # 3. `f[f.rfind("."):len(f)]` can be simplified as `f[f.rfind("."):]`
    # ... and well, there are other ugly things, but anyway ;-)

    files = [f for f in os.listdir(settings.BASE_DIR + '/app_pickfeel/static/app_pickfeel/images')
             if f[f.rfind("."):len(f)] in valid_extensions]

    # this is useless, you won't have duplicates in a directory file listing
    # (file names are unique within a directory)

    return [rand_dir + filename for filename in random.sample(files, count)]

, а затем

    {% random_images 3 as images %}
    <div class="row no-pad display-flex  my-row">
        {% for image in images %}
        <div class="....">
            <img class="img-thumbnail" src="{{ MEDIA_URL}}{{ image }}">
        </div>
        {% endfor %}
    </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...