提交多对多模型表单时出现"Select a valid choice. <choice> is not one of the available choices"错误



我想将ManyToManyField的选择限制为匹配ForeignKey的那些。表单显示正常,但保存时显示错误Select a valid choice. <choice> is not one of the available choices .

在我试图通过将视图中的参数传递给表单来限制查询集之前,然后使用该参数来过滤查询集。

模型:

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']

视图:

@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)

但是,如果我从视图传递查询集,它会完美地工作。

模型:

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(),
    }

视图:

@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)

有人能解释一下吗?

我昨天刚刚解决了一个类似的问题,就在这里,如何在一个modelmultiechoicefield中排除一个值?,但我认为问题与你的init函数是格式化的方式。而不是venue=venue_obj,你需要把它改为pk=venue_obj,因为它看起来你是在视图中获得场地的pk,而不是VenueEvent的场地属性,我重新格式化了你的表单一点,使它看起来更干净。

forms.py

class VenueEventForm(ModelForm):
    def __init__(self, *args, **kwargs): # limit timeslots to those of the venue only
        venue_obj = kwargs.pop('venue_obj')
        super(VenueEventForm, self).__init__(*args,**kwargs)
        self.fields['event_timeslots'] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), queryset=VenueEventTimeslot.objects.filter(pk=venue_obj))
    class Meta:
        model = VenueEvent
        fields = ['event_timeslots']

views.py

@login_required
def calendar(request, pk):
    venue = Venue.objects.get(pk = pk)
    if request.method == "POST":
        form = VenueEventForm(request.POST, venue_obj=venue)
        if form.is_valid():
            # form stuff
        else:
            print VenueEventForm.errors
    else:
        form = VenueEventForm(venue_obj=venue)
        context = {'venue':venue, 'form':form}
        return render(request, ... , context)

相关内容

最新更新