は私がフォームセットをレンダリングし、それが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
あなたは 'try ... except'を使って試してみましたか?エラーマッサージがある場合はエラーマッサージのテンプレートが例外であればそれを行うことができると思いますか? –