2016-11-22 11 views
0

は私がフォームセットをレンダリングし、それがPOSTメソッドを通じて提出があったときにそれを検証するために使用する以下のクラスベースのビュー持ちでフォームセットを検証:ジャンゴレンダリングし、クラスベースのビュー(リストビュー)

フォームセットを完全にレンダリングする。フォームを送信すると、フォームセットを読み込んでエラーをチェックできます。このクラスのpostメソッドで - >​​

私がフォームセットにエラーが見つかった場合、私はこのビューをレンダリングしたいと思いますが、今回はPOSTから読み込んだformsetインスタンスをレンダリングします。 私は次のエラーが呼び出しsuper(MissingProductsListView, self).get_context_data(*args, **kwargs)から引き上げますクラスのPOSTメソッド内ctx = self.get_context_data()フォームを呼び出すとき: 'MissingProductsListView' object has no attribute 'object_list'

リストビューのスーパークラスがこの呼び出しを実行したようです:queryset = kwargs.pop('object_list', self.object_list)

私の質問はなぜ私はこのエラーで走っていますか?このフォームセットをエラーメッセージとともにレンダリングして、投稿後のテンプレートに表示するにはどうすればよいですか?

self.object_list = self.get_queryset() 

をそして正直に言うと - 私はないです: - あなたはPOSTハンドラでこの部分を逃した基本的

class BaseListView(MultipleObjectMixin, View): 
    """ 
    A base view for displaying a list of objects. 
    """ 
    def get(self, request, *args, **kwargs): 
     self.object_list = self.get_queryset() 
     allow_empty = self.get_allow_empty() 

     if not allow_empty: 
      # When pagination is enabled and object_list is a queryset, 
      # it's better to do a cheap query than to load the unpaginated 
      # queryset in memory. 
      if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'): 
       is_empty = not self.object_list.exists() 
      else: 
       is_empty = len(self.object_list) == 0 
      if is_empty: 
       raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % { 
        'class_name': self.__class__.__name__, 
       }) 
     context = self.get_context_data() 
     return self.render_to_response(context) 

:私はここを見てジャンゴ1.9.9

class MissingProductsListView(generic.ListView): 
    template_name = 'dashboard/purchaseorder/missing_products.html' 
    context_object_name = 'backorders' 
    model = BackOrder 

    def post(self, request, *args, **kwargs): 
     backorder_formset = BackOrderFormset(request.POST) 
     errors = backorder_formset.errors 

     if backorder_formset.is_valid(): 
      # <process form cleaned data> 
      return HttpResponseRedirect('/success/') 
     else: 
      ctx = self.get_context_data() 
      return self.render_to_response(ctx) 


    def accumulate_identical_products_from_backorders(self, back_order_list): 
     ... some code 
     return sorted_accumulated_dict.values() 

    def get_context_data(self, *args, **kwargs): 
     ctx = super(MissingProductsListView, self).get_context_data(*args, **kwargs) 
     ctx['title'] = _("Missing Products") 
     if self.request.POST: 
      ctx['back_order_formset'] = BackOrderFormset(self.request.POST) 
     else: 
      accumulated_backorders_per_product = self.accumulate_identical_products_from_backorders(BackOrder.objects.all()) 

      back_orders = BackOrderFormset(initial=[{'product_id': backorder_dict['product_id'], 
                'product': backorder_dict['title'], 
                'quantity': backorder_dict['quantity']} for backorder_dict in 
                accumulated_backorders_per_product]) 
      ctx['back_order_formset'] = back_orders 
     return ctx 

    def get_queryset(self): 
     .. some code 
     return backorder_list 
+0

あなたは 'try ... except'を使って試してみましたか?エラーマッサージがある場合はエラーマッサージのテンプレートが例外であればそれを行うことができると思いますか? –

答えて

1

を使用していますdjangoのジェネリックListViewにポストを追加することをお勧めしますか? FormViewのように見えますが、私は間違っています。

+0

私は手動でページを再レンダリングし、このように手動でコンテキストを渡すときに例外で実行することができませんでした: 'else:return render(request、self.template_name、{'back_order_formset':backorder_formset})' 。 ListViewの代わりにFormViewを使用することで、私が実行していたエラーが回避され、よりクリーンなソリューションになりました。ありがとうございました! – matyas

関連する問題