Champ ChoiceField dynamique
Dans certains cas en utilisant le framework Django nous avons besoin d'ajouter un champ ChoiceField dynamique et non pas juste une liste de valeurs statiques contenues dans tuple ou liste, mais aussi que la liste des valeurs de la liste soit liée à un autre modèle, Je vais donc vous montrer comment réaliser ça rapidement avec le framework
Nous allons prendre comme exemple un modèle Pizza et un autre Ingredient qui pour le model Pizza sera lié aussi à modèle User permettant aux utilisateurs de créer leur propre pizza:
class Pizza(models.Model):
user = models.ForeignKey(User)
nom=models.Charfield(50)
ingredient=models.ManyToManyField(Ingredient)
class Ingredient(models.Model):
nom=models:Charfield(50)
Maintenant nous allons overrider la méthode __init__ de notre PizzaForm pour ajouter la liste d'ingrédients du modèle et on fait passer le modèle User à la méthode __init__ pour récupérer l'utilisateur spécifique, donc ne pas oublier de faire passer l'utilisateur: form = IngredientForm(user) :
class IngredientForm(forms.modelForn):
def __init__(self, user, *args, **kwargs):
super(PizzaForm, self).__init__(*args, **kwargs)
self.field[''ingredient] = forms.ModelChoiceField(queryset = Ingredient.objects.filter(user=user))
Meta:
model: Ingredient
Voilà il suffit juste d'ajouter au champ ingrédient la liste via un queryset queryset=Ingredient.objects.filter(user=user), ce qui permettra d'optenir les ingredients spécifiques pour chaque pizza mais filtrés par utilisateur dans le choiceField de votre formulaire.