J'ai du mal à comprendre comment créer un champ de choix dynamique 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 de cheminement associés à ce cavalier (qui serait la personne connectée).
Actuellement, je remplace init dans mes formulaires comme ceci:
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 ce que cela fait est de lister tous les waypoints, ils ne sont associés à aucun pilote en particulier. Des idées? Merci.
python
django
django-forms
django-templates
quoi quoi
la source
la source
CheckboxSelectMultiple
widget avec cela, vous voudrez utiliserMultipleChoiceField
ouModelMultipleChoiceField
. Au début, cela semble fonctionner avecChoiceField
, mais les composants internes se cassent lorsque vous essayez d'enregistrer le formulaire.CheckboxSelectMultiple
widget avec ce code. Assurez-vous de passerChoiceForm
auMultipleChoiceForm
Il existe une solution intégrée à votre problème: ModelChoiceField .
En général, il vaut toujours la peine d'essayer d'utiliser
ModelForm
lorsque vous devez créer / modifier des objets de base de données. Fonctionne dans 95% des cas et c'est beaucoup plus propre que de créer votre propre implémentation.la source
le problème c'est quand tu fais
dans une demande de mise à jour, la valeur précédente sera perdue!
la source
Que diriez-vous de passer l'instance de rider au formulaire lors de son initialisation?
la source
Sous la solution de travail avec champ de choix normal. mon problème était que chaque utilisateur avait ses propres options de champ de choix PERSONNALISÉES basées sur quelques conditions.
la source
Comme l'ont souligné Breedly et Liang, la solution d'Ashok vous empêchera d'obtenir la valeur de sélection lors de la publication du formulaire.
Une façon légèrement différente, mais toujours imparfaite, de résoudre ce problème serait:
Cela pourrait cependant causer des problèmes de compatibilité.
la source
Vous pouvez déclarer le champ comme un attribut de première classe de votre formulaire et simplement définir des choix de manière dynamique:
Vous pouvez également utiliser un ModelChoiceField et définir le jeu de requêtes sur init de la même manière.
la source
Si vous avez besoin d'un champ de choix dynamique dans django admin; Cela fonctionne pour django> = 2.1.
J'espère que cela t'aides.
la source