153 votes

Création d’un champ de choix dynamique

J'ai un peu de mal à essayer de comprendre comment créer une dynamique champ de choix dans django. J'ai un modèle mis en place quelque chose comme:

class rider(models.Model):
     user = models.ForeignKey(User)
     waypoint = models.ManyToManyField(Waypoint)

class Waypoint(models.Model):
     lat = models.FloatField()
     lng = models.FloatField()

Ce que j'essaie de faire est de créer un Champ de choix dont les valeurs sont les points associés à ce coureur (qui serait la personne connecté).

Actuellement, je suis primordial init dans mes formes comme:

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

Mais tout cela n'est la liste de tous les waypoints, ils ne sont pas associés à un coureur en particulier. Des idées? Merci.

204voto

Ashok Points 5987

vous pouvez filtrer les waypoints en passant de l’utilisateur à l’init du formulaire

de votre vue tout en initiant la forme passe de l’utilisateur

en cas de modèle de formulaire

13voto

Alex Lebedev Points 4273

Il existe une solution intégrée pour votre problème : ModelChoiceField

En règle générale, il est toujours intéressant d’essayer d’utiliser `` lorsque vous avez besoin créer/modifier des objets de base de données. Travaille dans 95 % des cas et il est beaucoup plus propre que de créer votre propre implémentation.

9voto

Liang Points 61

le problème est lorsque vous ne

dans une demande de mise à jour, la valeur précédente sera perdu !

4voto

Manoj Govindan Points 24030

Que diriez-vous passant l’instance de cavalier à la forme tout en initialisant ?

1voto

Haroldo_OK Points 352

Comme l’a fait Breedly et Liang, solution de Ashok vous empêchera d’obtention de la valeur select lors de la validation du formulaire.

Une façon légèrement différente, mais toujours imparfaite, à résoudre ce serait :

Cela pourrait causer des problèmes de concurrence, cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X