2017-09-03 4 views
0

Ich versuche, eine Liste zu erstellen, um die Auswahlmöglichkeiten für ein Formular zu füllen. Diese Liste ist dynamisch und hängt davon ab, welche Optionen von anderen Benutzern erstellt wurden. Hier ist ein Beispiel des Modells soll die Liste stammt aus:So erstellen Sie ein dynamisches Django-Auswahlfeld

#models.py 
class User(models.Model): 
    brewery_you_work_for = models.CharField(choises=ALL_THE_BREWERIES_IN_THE_WORLD) 
    username = models.CharField() 

ich die Form will, so etwas sein:

#forms.py 
class BestBrewery(forms.Form): 
    vote = forms.ChoiceField(choices=BREWERIES_A_USER_WORKS_FOR) 

Was ich tun möchte, ist eine Liste aller Brauereien in der Welt für einige Benutzer, um als die Brauerei zu wählen, für die sie arbeiten. Dann möchte ich eine Liste erstellen, in der andere Nutzer die beste Brauerei wählen können.

Lässt sagen, ich habe 3 Benutzer, die behaupten, sie arbeiten die Sierra Nevada, 2 Benutzer, die behaupten, sie arbeiten für Budweiser, und 5 Benutzer, die behaupten, sie arbeiten für Coors.

Ich möchte eine Liste von Brauereien zu erzeugen, die wie folgt aussehen:

(
'Budweiser', 
'Coors, 
'Sierra Nevada', 
) 

Hinweis die alphabetische Reihenfolge und keine wiederholte Brauerei Angebote.

Antwort

1

Nun, ich denke, Sie können "Entscheidungen" als Ergebnis der Funktion festlegen. Ich habe versucht, wie folgt aus:

def yolo(): 
    # there we will get stats from db and return choices depends on stats 
    first_query = 1 # there U will use more complicated logic :) 
    second_query = 3 
    if first_query > second_query: 
     return (1, 2, 3) 
    else: 
     return (1, 3) 

class Event(models.Model): 
    date = models.DateField(primary_key=True) 
    count_of_updates = models.SmallIntegerField(default=0) 
    yolos = models.CharField(max_length=255, choices=yolo()) 

Und für sicher zu sein, U ur Entscheidungen mit etwas hässlich überprüfen:

choices = s._meta.get_field_by_name('yolos')[0].choices 
print choices 

Ordnung und andere Dinge u in func Logik einstellen :)

0

In Ihrem Formular können Sie die Auswahl Ihres Felds in der init ändern.

class BestBrewery(forms.Form): 
    vote = forms.ChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(BestBrewery, self).__init__(*arg, **kwargs) 

     # get the choices from where you need 
     choices = (...) 
     self.fields['vote'].choices = choices 
0

Sie benötigen ein zusätzliches user Argument zu übergeben, wenn das Formular initialisiert. Normalerweise dies wie wenn Sie View-Funktionen verwenden:

form = BestBrewery(request.user) 

Wenn Sie mit der Klasse Basierend Ansichten sollten Sie die get_form_kwargs Methode Ihrer Ansicht nach außer Kraft setzen:

def get_form_kwargs(self): 
    kwargs = super(MyView, self).get_form_kwargs() 
    kwargs['user'] = self.request.user 

    return kwargs 

Ihr Formular sollte wie folgt aussehen:

Beachten Sie, dass zum Überschreiben des Felds choices Tupel mit dem Wert für das Formular und den Text, der im Dropd angezeigt werden soll, bereitgestellt werden müssen besitzen.

Verwandte Themen