2016-01-13 13 views
10

私はクラスベースのビューでdjango formsetを使いたいです。 これは、ビュー、django __init__引数エラーを引き起こすメソッド

class PeriodCreate(RequestPassingFormViewMixin, WammuCreateView): 
    model = Chain 
    template_name = 'dashboard/period_form.html' 
    form_class = ChainForm 

    def get_object(self): 
     chain = Chain.objects.get(pk=self.kwargs['chain_pk']) 
     return chain 


    def get_success_url(self): 
     return reverse('dashboard_period_list', kwargs={'chain_pk': self.object.chain.id, })              


    def get_context_data(self, **kwargs): 
     context = super(PeriodCreate, self).get_context_data(**kwargs) 
     return context 

    def get_form_kwargs(self, *args, **kwargs): 
     kwargs = super(PeriodCreate, self).get_form_kwargs(*args, **kwargs) 
     chain = get_object_or_404(Chain, pk=self.kwargs['chain_pk']) 
     period = Period(chain=chain) 
     kwargs['instance'] = period 
     return kwargs 

    def get(self, request, *args, **kwargs): 
     self.object = None 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     PeriodInlineFormSet = inlineformset_factory(Chain, Period, 
               form=PeriodInlineForm, 
               can_delete=True, 
               extra=12) 
     PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm, request=request, chain=self.object)) 
     period_formset = PeriodInlineFormSet() 
     return self.render_to_response(
     self.get_context_data(form=form, 
           period_inline_formset=period_formset)) 
    def post(self, request, *args, **kwargs): 
     self.object = Chain() 
     form = self.get_form(self.form_class) 
     PeriodInlineFormSet = inlineformset_factory(Chain, Period, 
                 form=PeriodInlineForm, 
                 can_delete=True, 
                 extra=5) 
     PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm)) 

     if form.is_valid(): 
      self.object = form.save(commit=False) 

      period_formset = PeriodInlineFormSet(request.POST, instance=self.object) 

      if period_formset.is_valid(): 
       self.object.save() 
       period_formset.save() 
       return super(PeriodCreate, self).form_valid(form) 
      else: 
       return self.render_to_response(
        context=self.get_context_data(form=form, period_inline_formset=period_formset)) 

     else: 
      period_formset = PeriodInlineFormSet(request.POST,instance=self.object) 
      return self.render_to_response(
       context=self.get_context_data(form=form, period_inline_formset=period_formset)) 

があり、これは私のフォーム、

class PeriodForm(RequestPassingFormMixin, ModelForm): 
    class Meta: 
     model = Period 
     fields = ['start_date', 'end_date', 'year', 'description'] 

であり、ここで私の 'RequestPassingFormMixin' です:

class RequestPassingFormMixin(object): 

    def __init__(self, request, param, *args, **kwargs): 
     self.request = request 
     self.param = param 
     super(RequestPassingFormMixin, self).__init__(*args, **kwargs) 

が、私は次のエラーを取得しています、

TypeError at .... 
__init__() takes at least 3 arguments (2 given) 

このエラー私はフォームセットをレンダリングしたテンプレートを示すので、私も(私は森をレンダリングしている部分のみを)テンプレートを与えている、

    <tbody> 
         {% csrf_token %} 
         {{ period_inline_formset.management_form }} 
         {% for period_form in period_inline_formset %} 
          {% for hidden in period_form.hidden_fields %} 
           {{ hidden }} 
          {% endfor %} 
          {{period_form.pk}} 
          <tr> 

           <td>{{ period_form.start_date }}</td> 
           <td>{{ period_form.end_date }}</td> 
           <td>{{ period_form.year }}</td> 
           <td>{{ period_form.description }}</td> 

           <td> {% if period_formset.can_delete %} 
            {{ period_form.DELETE }} {% endif %}</td> 
          </tr> 
         {% endfor %} 
       </tbody> 

私はDjangoのフォームセットを使用して使用しておりません、限りあなたはあなたのコードを持ついくつかの問題を持っている

答えて

3

...私は、そのないフォームセットエラー推測、またはそれは多分、私はここに何か他のものをしないのです、かもしれませんが、長い発見した後、私はそれを把握することはできません;実際のエラーから始めて - requestparamという2つの追加の必須の必須引数を取るときには、*args**kwargs__init__のメソッドをRequestPassingFormMixinに渡すだけです。

問題のある行は次のとおりです。

super(RequestPassingFormMixin, self).__init__(*args, **kwargs) 

あなたは本当にも、この行は必要ありません。あなたは何も上書きしていないからです。あなたはただそれを削除することができます。実際に

それはリクエストやパラメータは、すでにすべてのクラスベースのビューが利用可能であるため、それがないすべてだ場合、あなたは、この全体のミックスインを削除することができます。

また、このミックスインをフォームクラスの親として使用している理由もわかりません。あなたがしたいことはしません。

その他の問題があります。メソッドをオーバーライドしていますが、機能を変更していないため、コードは実際には何も変わりません。あなたが望むすべてがクラスベースのフォームセットと互換性のあるビューを作成し、django-extra-viewsを使用している場合

  1. は、私はいくつかの提案を持っています。

  2. この行chain = Chain.objects.get(pk=self.request.session.get('chain_pk'))は、クラス内のどこにでもchainを設定していないため、実質的に失われています。なぜあなたはこの行を持っているのか分かりません。

+0

あなたの答えのおかげで、それは私のインラインフォームセットを表示するために私を助け、ええそこに私のコードのバグの多くは、そのない私のコード、その生産のコードは、実際にあったと私はit.nowに仕事をしなければなりません問題は、私のフォームが保存されていないか、またはフォームが無効であると言うことができるので、私はそれをポストしたり保存したいときにフォームに戻ってくることができます。あなたはこの問題を解決するためにさらに助けてください、私はdjangoインラインformsetで動作するために使用されていないため、私は 'かもしれない'と述べた。私はあなたに追加の質問であることを知っています。しかし、あなたがこの問題について私をさらに助けてくれれば幸いです。 @Burhan Khalid – RTan

+0

詳細について別の質問をして、この質問へのリンクを追加してください。私はあなたが書式の問題に直面する唯一の人ではないと確信しています。 –

+0

私はこの問題に関する新しい質問を投稿しています。このリンクはhttp://stackoverflow.com/questions/35123355/data-is-not-saving-in-django-formsetです。 – RTan

関連する問題