我正在尝试使用formset为与日期相关的一组时间帧创建表单:
class Event(models.Model):
date = models.DateField()
class TimeFrame(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
event = models.ForeignKey('Event')
我有一些代码,它为我提供了每个事件的时间帧查询集,并添加了一个kwarg将其传递给我的表单:
class SelectDatesForm(forms.Form):
timeframes = forms.ModelChoiceField(queryset=HostTimeFrame.objects.none())
def __init__(self, *args, **kwargs):
qs = kwargs.pop('timeframes')
super(SelectDatesForm, self).__init__(*args, **kwargs)
self.fields['timeframes'].queryset = qs
现在我正在尝试构建一个formset,它允许我在一个页面上显示多个事件的时间范围 . 我已经找到了this问题,解释了如何传递初始数据,对于多种形式,但它与将它传递给查询集不同 .
另外还有来自django 1.9的this新函数,但它不允许我为每个表单获取不同的查询集 .
更新:我得到了答案的解决方案,但是,每当我运行formset.is_valid()我得到错误:
选择有效的选择 . 这种选择不是可用的选择之一 .
以下是我在观点中所做的事情:
timeframes = [HostTimeFrame.objects.all()]
SelectDatesFormset = formset_factory(form=SelectDatesForm, extra=len(timeframes), formset=BaseSelectDatesFormSet)
if request.method == 'POST':
formset = SelectDatesFormset(request.POST, form_kwargs={'timeframes_list': timeframes})
if formset.is_valid():
# do something with the formset.cleaned_data
print(formset)
pass
else:
formset = SelectDatesFormset(form_kwargs={'timeframes_list': timeframes})
我已经花了好几个小时才找到完成这个实际验证的地方,但我无法找到它为我的生活 .
编辑:我用单数形式测试了这个,我有同样的问题,我为此创建了一个新问题here .