2017-04-24 62 views
1

我试图从20个数字列表中选取3个随机数字。消除django中的重复内容

在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个不同的数字,但我不知道应用哪个过滤器/标签。我试过如果/ else语句,for循环,(如果有重复我想重绘),但我不满意的结果,我很确定有一个简单的过滤器来做到这一点。

+0

您是否在使用'nums'列表用于其他目的而不是挑选随机数?如果没有,可以先前清理nums列表,然后选择前3个元素。 – serg

+0

我使用该列表仅用于拾取随机数 –

回答

1

我不认为有一个合理的方法来做到这一点与内置的过滤器。我只需在视图中选择数字并将其传递给上下文。

如果你的渲染是一致的,并要在此做了很多的地方,你可以写一个自定义模板标签,例如:在你的模板

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

但我认为在视图中做它更简单。

+0

谢谢@PeterDeGlopper。我是Django的新手,我确信这个解决方案对我目前的水平来说太高级了。尽管我会阅读有关自定义标签的文档。对我来说,这是一件好事,我知道我可以深入这个方向。 –

+0

他们是“我想做一些内置模板标签和过滤器的先进技术”的一般答案之一。另一种方法是在视图中执行此操作并将结果传递给模板。 –

+0

感谢百万人的反馈,我已阅读django文档以了解您对自定义模板标签的帮助。不仅如此,我成功地实现了我的代码工作(添加了__init__.py文件,加载自定义标签等),而且更重要的是,您让我意识到并理解了django的强大功能!我意识到,我能做的比我想象的要多得多。 Thx再次! –

0

您可以使用此功能创建您的模板标签以解决您的问题。

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会从您的视图到本例中的模板背景下通过。

+1

只需使用random.sample而不是无限期的while循环,这就是它的目的。 –

+0

thx @PeterDeGlopper指出,我不知道random.sample之前! – matyas

+0

谢谢@matyas我欣赏反馈。然后我会研究自定义标签解决方案。 –