2016-12-06 63 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')