【问题标题】:"Select a valid choice. <choice> is not one of the available choices" error when submitting ManyToMany ModelForm提交 ManyToMany ModelForm 时出现“选择一个有效的选项。<choice> 不是可用选项之一”错误
【发布时间】:2015-11-08 03:15:31
【问题描述】:

我想将 ManyToManyField 的选择限制为与 ForeignKey 匹配的选择。表单显示正常,但保存后会出现错误Select a valid choice. &lt;choice&gt; 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)

有人能解释一下吗?

【问题讨论】:

  • 所以你是说你的模型表单,__init__() 不能正常工作?
  • 提出一个答案,让我知道这对你有用。

标签: django django-models django-forms modelform manytomanyfield


【解决方案1】:

我刚刚解决了一个与昨天类似的问题,就在这里,How To Exclude A Value In A ModelMultipleChoiceField?,但我认为你的 init 函数的问题在于它的格式化方式。您需要将其更改为 pk=venue_obj 而不是场地=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)

【讨论】:

  • 抱歉,您在哪里看到场地 = 场地?
  • 我知道你现在在哪里了,我看错了视图,让我看看我是否可以在这里编辑我的答案。
  • 你到底想在 inti 函数中弹出什么你想从列表中取出什么。
  • 我正在过滤与当前 Venue 匹配的 VenueEventTimeslots。因此将场地从视图传递到初始化。我想再次强调表单显示正常。它只在提交时出错。
  • 好吧,我编辑了我的答案,也许这会奏效,如果我没有尝试过,因为我没有别的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2017-05-28
  • 1970-01-01
  • 2019-01-14
  • 2021-01-25
  • 2018-04-30
相关资源
最近更新 更多