2016-12-06 58 views
1

我试图用一个表单集为一组相关的日期时间框架的创建形式:提供每种形式不同kwargs

class Event(models.Model): 
    date = models.DateField() 

class TimeFrame(models.Model): 
    start = models.DateTimeField() 
    end = models.DateTimeField() 
    event = models.ForeignKey('Event') 

我的代码,让我时限的queryset的每个事件并增加了一个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问题,解释了如何传递初始数据,用于多种形式,但与将它传递给查询集不同。

还有this django 1.9的新功能,但它不允许我为每个窗体获取不同的查询集。

更新: 我从答案的解决方案然而工作,每当进出口运行formset.is_valid()我得到的错误:

Select a valid choice. That choice is not one of the available choices.

这是我做我的观点:

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创建了一个新的问题。

回答

0

更新: 只有部分解决方案,请参阅问题。

解决它自己:

首先,我创建了一个BaseFormSet:

class BaseSelectDatesFormSet(BaseFormSet): 
    def get_form_kwargs(self, index): 
     kwargs = super(BaseSelectDatesFormSet, self).get_form_kwargs(index) 
     kwargs['timeframes'] = kwargs['timeframes_list'][index] 
     return kwargs 

然后,我可以传递时限的列表视图:

SelectDatesFormset = formset_factory(form=SelectDatesForm, extra=4, formset=BaseSelectDatesFormSet) 
formset = SelectDatesFormset(form_kwargs={'timeframes_list': timeframes}) 

最后,我不得不更新我的形式init弹出列表以及超级构造函数doesnt抱怨不需要的kwargs:

def __init__(self, *args, **kwargs): 
    qs = kwargs.pop('timeframes') 
    qs_list = kwargs.pop('timeframes_list') 
    super(SelectDatesForm, self).__init__(*args, **kwargs) 
    self.fields['timeframes'].queryset = qs.order_by('start')