2017-04-24 71 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我欣賞反饋。然後我會研究自定義標籤解決方案。 –