Mam pewne problemy ze zrozumieniem, jak utworzyć dynamiczne pole wyboru w django. Mam ustawiony model coś takiego:
class rider(models.Model):
user = models.ForeignKey(User)
waypoint = models.ManyToManyField(Waypoint)
class Waypoint(models.Model):
lat = models.FloatField()
lng = models.FloatField()
To, co próbuję zrobić, to stworzyć pole wyboru, którego wartości są punktami drogi skojarzonymi z tym jeźdźcem (którym byłaby zalogowana osoba).
Obecnie nadpisuję init w moich formularzach:
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()])
Ale wszystko, co robi, to lista wszystkich punktów trasy, nie są one powiązane z żadnym konkretnym jeźdźcem. Jakieś pomysły? Dzięki.
CheckboxSelectMultiple
widżetu z tym, będziesz chciał użyćMultipleChoiceField
lubModelMultipleChoiceField
. Na początku wygląda na to, że działaChoiceField
, ale wewnętrzne elementy pękną, gdy spróbujesz zapisać formularz.CheckboxSelectMultiple
z kodem Unicode), jeśli planujesz używać widżetu z tym kodem. Pamiętaj, aby zmienićChoiceForm
naMultipleChoiceForm
Istnieje wbudowane rozwiązanie problemu: ModelChoiceField .
Ogólnie rzecz biorąc, zawsze warto spróbować użyć,
ModelForm
gdy musisz stworzyć / zmienić obiekty bazy danych. Działa w 95% przypadków i jest znacznie czystszy niż tworzenie własnej implementacji.źródło
problem pojawia się, kiedy to zrobisz
w żądaniu aktualizacji poprzednia wartość zostanie utracona!
źródło
Co powiesz na przekazanie instancji rider do formularza podczas inicjalizacji?
źródło
Pod rozwiązaniem roboczym z normalnym polem wyboru. mój problem polegał na tym, że każdy użytkownik miał własne NIESTANDARDOWE opcje pola wyboru w oparciu o kilka warunków.
źródło
Jak zauważyli Breedly i Liang, rozwiązanie Ashoka uniemożliwi uzyskanie wybranej wartości podczas wysyłania formularza.
Trochę inny, ale wciąż niedoskonały sposób rozwiązania tego problemu to:
Może to jednak powodować pewne problemy ze współbieżnością.
źródło
Możesz zadeklarować pole jako atrybut pierwszej klasy swojego formularza i po prostu dynamicznie ustawiać opcje:
Możesz również użyć ModelChoiceField i ustawić zestaw zapytań na init w podobny sposób.
źródło
Jeśli potrzebujesz dynamicznego pola wyboru w panelu django; Działa to dla django> = 2.1.
Mam nadzieję że to pomoże.
źródło