Je veux limiter les choix d'un ManyToManyField à ceux correspondant à un ForeignKey. Le formulaire s'affiche correctement, mais lors de l'enregistrement des résultats dans une erreur "Sélectionner un choix valide n'est pas l'un des choix disponibles"."Sélectionnez un choix valide <choice> n'est pas l'un des choix disponibles" erreur lors de la soumission ManyToMany ModelForm
Avant d'essayer de limiter le jeu de requête en passant un paramètre dans la vue au formulaire, puis en utilisant ce paramètre pour filtrer le jeu de requête.
Modèles:
class VenueEventTimeslot(models.Model):
venue = models.ForeignKey(Venue)
name = models.CharField(max_length=255)
class VenueEvent(models.Model):
venue = models.ForeignKey(Venue)
event_timeslots = models.ManyToManyField(VenueEventTimeslot)
class VenueEventForm(ModelForm):
event_timeslots = ModelMultipleChoiceField(queryset=None, widget=CheckboxSelectMultiple())
def __init__(self, *args, **kwargs): # limit timeslots to those of the venue only
venue_obj = kwargs.pop('venue_obj',None)
super(VenueEventForm, self).__init__(*args,**kwargs)
self.fields['event_timeslots'].queryset=VenueEventTimeslot.objects.filter(venue=venue_obj)
class Meta:
model = VenueEvent
fields = ['event_timeslots']
Vues:
@login_required
def calendar(request, pk):
venue = Venue.objects.get(pk = pk)
if request.method == "POST":
form = VenueEventForm(request.POST)
if form.is_valid():
# form stuff
else:
form = VenueEventForm(venue_obj = venue)
context = {'venue':venue, 'form':form}
return render(request, ... , context)
Cependant, si je passais la queryset de la vue, il fonctionne parfaitement.
Modèles:
class VenueEventTimeslot(models.Model):
# same as above
class VenueEvent(models.Model):
# same as above
class VenueEventForm(ModelForm):
class Meta:
model = VenueEvent
fields = ['date','client_name','event_timeslots']
widgets = {
'date': SelectDateWidget(),
'event_timeslots': CheckboxSelectMultiple(),
}
Vues:
@login_required
def calendar(request, pk):
venue = Venue.objects.get(pk = pk)
if request.method == "POST":
form = VenueEventForm(request.POST)
if form.is_valid():
# form stuff
else:
form = VenueEventForm()
form.fields['event_timeslots'].queryset=VenueEventTimeslot.objects.filter(venue=venue)
context = {'venue':venue, 'form':form}
return render(request, ..., context)
Est-ce que quelqu'un en mesure de faire la lumière sur ce sujet?
donc êtes-vous vous dire modèle de formulaire, __init __() ne fonctionne pas correctement? –
Mettez une réponse en place laissez-moi savoir comment cela fonctionne pour vous. –