Я пытаюсь подобрать 3 случайных числа из списка из 20 чисел.

В views.py я определил эту переменную:

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

В моем шаблоне index.html:

{{ nums|random }} - {{ nums|random }} - {{ nums|random }}

Я хочу получить 3 разных числа, но я не знаю, какой фильтр / тег применять.

Я пробовал операторы if / else для циклов (если есть дубликат, я хочу перерисовать), но я не удовлетворен результатами, и я почти уверен, что для этого есть простой фильтр.

1
Jay Man 25 Апр 2017 в 01:49

2 ответа

Лучший ответ

Я не думаю, что есть разумный способ сделать это с помощью встроенных фильтров. Я просто выбрал бы числа в представлении и передал это контексту.

Если ваш рендеринг последовательный, и вы хотите делать это во многих местах, вы можете написать собственный тег шаблона, например:

import random
from django import template

register = template.Library()

@register.simple_tag
def random_sample(population, k):
    return ' - '.join(str(choice) for choice in random.sample(population, k))

Тогда {% random_sample nums 3 %} в вашем шаблоне.

Но я думаю, что делать это с точки зрения проще.

1
Peter DeGlopper 24 Апр 2017 в 23:18

Вы можете создать тег шаблона с этой функциональностью, чтобы решить вашу проблему.

YourApp / templatetags / custom_choice_tags.py

from django import template
import random

register = template.Library()

@register.assignment_tag
def get_three_unique_random_values_from_list(value_list):
    random_choices = random.sample(value_list, 3)
    selected_choices = {
        'first_choice': random_choices[0],
        'second_choice': random_choices[1],
        'third_choice': random_choices[2],
    }
    return selected_choices

А затем в вашем template.html:

{% load custom_choice_tags %}

{% get_three_unique_random_values_from_list random_list  as random_choices %}

 {{ random_choices }} 

Переменная random_list будет передана из вашего представления в контекст шаблона в этом примере.

0
matyas 25 Апр 2017 в 07:20
43598887