2016-12-06 11 views
1

私は日付に関連した時間枠のセットのためのフォームを作成するフォームセットを使用しようとしています:フォームセット内の各フォームごとに異なるkwargsからの提供

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 

は今、私は私が1ページに複数のイベントのための時間枠を表示することができますフォームセットを構築しようとしています。私はすでにthisの質問を見つけ、初期データをサーバフォームに渡す方法を説明しましたが、それはクエリーセットに渡すのと同じではありません。

また、django 1.9の新機能はthisですが、各フォームで異なるクエリセットを取得することはできません。

UPDATE:

ここ

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

は私が私の見解では何をすべきかです: 私はイムランニング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の新しい質問を作成しました。

答えて

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

最後に、私は私を更新しましたも同様にリストをポップすると、スーパーコンストラクタが不要な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') 
関連する問題