2017-04-24 7 views
1

Ich versuche, 3 zufällige Zahlen aus einer Liste von 20 Zahlen zu holen.eliminieren Duplikate in Django

In views.py habe ich diese Variable definiert:

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

In meiner Vorlage index.html:

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

I 3 verschiedene Nummern bekommen wollen, aber ich weiß nicht wissen, welcher Filter/Tag angewendet werden soll.

Ich habe versucht, if/else-Anweisungen, für Schleifen, (wenn es ein Duplikat gibt, ich möchte ein Redraw), aber ich bin nicht mit den Ergebnissen zufrieden und ich bin ziemlich sicher, es gibt einen einfachen Filter, um das zu tun.

+0

Verwenden Sie die 'nums'-Liste für andere Zwecke als die Auswahl von Zufallszahlen? Ist dies nicht der Fall, können Sie die Nummernliste im Voraus mischen und die ersten drei Elemente auswählen. – serg

+0

Ich benutze die Liste nur um Zufallszahlen aufzuheben –

Antwort

1

Ich glaube nicht, dass es einen vernünftigen Weg gibt, dies mit den eingebauten Filtern zu tun. Ich würde einfach die Zahlen in der Ansicht auswählen und diese an den Kontext übergeben.

Wenn Ihr Rendering konsistent ist und Sie wollen, dass diese eine Menge von Orten zu tun, Sie einen eigenen Template-Tag schreiben können, zB:

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)) 

Dann {% random_sample nums 3 %} in Ihrer Vorlage.

Aber ich denke, es in der Ansicht ist einfacher.

+0

Danke @PeterDeGlopper. Ich bin neu in Django und diese Lösung, von der ich sicher bin, ist für mein aktuelles Level zu fortgeschritten. Ich werde jedoch die Dokumentation über benutzerdefinierte Tags lesen. Das ist eine gute Sache für mich zu wissen, dass ich in diese Richtung graben kann. –

+0

Sie sind eine der allgemeinen Antworten auf "Ich möchte etwas tun, das für die eingebauten Template-Tags und Filter zu fortgeschritten ist". Der andere ist es einfach in der Ansicht zu tun und das Ergebnis an die Vorlage zu übergeben. –

+0

Vielen Dank für die Rückmeldung. Ich habe die django-Dokumentation gelesen, um Ihre Hilfe zu benutzerdefinierten Vorlagen-Tags zu verstehen. Und nicht nur, dass es mir gelungen ist, meinen Code zum Laufen zu bringen (die __init__.py-Datei hinzugefügt, das benutzerdefinierte Tag geladen usw.), sondern auch und vielleicht noch wichtiger, du hast mich dazu gebracht, die Macht von django zu verstehen und zu verstehen! Mir ist klar, dass ich viel mehr kann, als ich dachte. Danke nochmal! –

0

Sie könnten Ihren Templatetag mit dieser Funktionalität erstellen, um Ihr Problem zu lösen.

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 

und dann in Ihrem template.html:

{% load custom_choice_tags %} 

{% get_three_unique_random_values_from_list random_list as random_choices %} 

{{ random_choices }} 

die Variable random_list wäre aus Ihrer Sicht in die Vorlage Kontext in diesem Beispiel übergeben werden.

+1

Verwenden Sie einfach random.sample und nicht die unbestimmte Dauer while loop, dafür ist es da. –

+0

thx @PeterDeGlopper für den Hinweis, dass ich nicht über random.sample vorher wusste! – matyas

+0

Dank @matyas ich schätze das Feedback. Ich werde dann in benutzerdefinierte Tags Lösung suchen. –