我有一种情况,我想在我的 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)