Ich habe einige Probleme beim Versuch zu verstehen, wie ein dynamisches Auswahlfeld in Django erstellt wird. Ich habe ein Modell eingerichtet wie:
class rider(models.Model):
user = models.ForeignKey(User)
waypoint = models.ManyToManyField(Waypoint)
class Waypoint(models.Model):
lat = models.FloatField()
lng = models.FloatField()
Ich versuche, ein Auswahlfeld zu erstellen, dessen Werte die Wegpunkte sind, die diesem Fahrer zugeordnet sind (dies wäre die angemeldete Person).
Derzeit überschreibe ich init in meinen Formularen wie folgt:
class waypointForm(forms.Form):
def __init__(self, *args, **kwargs):
super(joinTripForm, self).__init__(*args, **kwargs)
self.fields['waypoints'] = forms.ChoiceField(choices=[ (o.id, str(o)) for o in Waypoint.objects.all()])
Aber alles, was Sie tun müssen, ist, alle Wegpunkte aufzulisten. Sie sind keinem bestimmten Fahrer zugeordnet. Irgendwelche Ideen? Vielen Dank.
python
django
django-forms
django-templates
was was
quelle
quelle
CheckboxSelectMultiple
Widget damit verwenden möchten, möchten SieMultipleChoiceField
oder verwendenModelMultipleChoiceField
. Zuerst scheint es zu funktionierenChoiceField
, aber die Interna brechen, wenn Sie versuchen, das Formular zu speichern.CheckboxSelectMultiple
Widget mit diesem Code verwenden möchten.ChoiceForm
MultipleChoiceForm
Es gibt eine integrierte Lösung für Ihr Problem: ModelChoiceField .
Im Allgemeinen lohnt es sich immer, zu versuchen,
ModelForm
wenn Sie Datenbankobjekte erstellen / ändern müssen. Funktioniert in 95% der Fälle und ist viel sauberer als das Erstellen einer eigenen Implementierung.quelle
Das Problem ist, wenn Sie es tun
Bei einer Update-Anfrage geht der vorherige Wert verloren!
quelle
Wie wäre es, wenn Sie die Rider-Instanz beim Initialisieren an das Formular übergeben?
quelle
Unter Arbeitslösung mit normalem Auswahlfeld. Mein Problem war, dass jeder Benutzer seine eigenen CUSTOM-Auswahlfeldoptionen hat, die auf wenigen Bedingungen basieren.
quelle
Wie von Breedly und Liang ausgeführt, verhindert die Lösung von Ashok, dass Sie beim Senden des Formulars den ausgewählten Wert erhalten.
Ein etwas anderer, aber immer noch unvollkommener Weg, dies zu lösen, wäre:
Dies kann jedoch zu Übereinstimmungsproblemen führen.
quelle
Sie können das Feld als erstklassiges Attribut Ihres Formulars deklarieren und die Auswahl einfach dynamisch festlegen:
Sie können auch ein ModelChoiceField verwenden und das Abfrageset auf ähnliche Weise auf init setzen.
quelle
Wenn Sie ein dynamisches Auswahlfeld in django admin benötigen; Dies funktioniert für django> = 2.1.
Hoffe das hilft.
quelle