CreateView にモデルフォームを追加したい状況があります。誰かが注文を追加してから、その注文にアイテムを追加できるエントリ注文システムがあります。通常、誰かが初めて注文を追加するとき、その注文にアイテムも追加したいので、それらのモデルを単一のフォームに結合し、最初の注文入力で処理したいと考えています。フォームが検証されないときに問題が発生しています。
get_context_data をオーバーライドして項目フォームをテンプレートに追加し、post をオーバーライドして余分なフォームを処理しました。しかし、フォームが無効な場合は、POST データを渡して元のフォームを再レンダリングする必要があります。POST データの有無にかかわらずフォームをレンダリングするために get_context_data をオーバーライドする好ましい方法は何ですか? 私はこのようなことをすべきですか?
def get_context_data(self, **kwargs):
context = super(OrderAdd, self).get_context_data(**kwargs)
if self.request.method == 'POST':
item_form = ItemForm(self.request.POST, prefix='item')
else:
item_form = ItemForm(prefix='item')
context['item_form'] = item_form
return context
これが私の CreateView で、現在行き詰まっています。
class OrderAdd(CreateView):
model = Order
form_class = OrderForm
context_object_name = 'object'
template_name = 'form.html'
def get_context_data(self, **kwargs):
context = super(OrderAdd, self).get_context_data(**kwargs)
item_form = ItemForm(prefix='item')
context['item_form'] = item_form
return context
def post(self, request, *args, **kwargs):
order_form = OrderForm(request.POST)
item_form = ItemForm(request.POST, prefix='item')
if order_form.is_valid() and item_form.is_valid():
return self.form_valid(order_form)
else:
context = self.get_context_data()
return render(self.request, 'form.html', context)