消除django中的重复项

时间:2017-04-24 22:49:04

标签: django django-templates django-views django-queryset

我试图从20个数字列表中选取3个随机数。

在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语句,for循环,(如果有重复我想要重绘)但我对结果不满意并且我非常确定&和#39;这是一个简单的过滤器。

2 个答案:

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

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

答案 1 :(得分: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将从您的视图传递到此示例中的模板上下文。