1

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

1 回答 1

3

一种稍微不优雅的方法:

def get_context_data(self, **kwargs):
    context = super(OrderAdd, self).get_context_data(**kwargs)
    if self.request.method == 'POST':
        return context
    else:
        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()
        context['item_form'] = item_form
        return render(self.request, 'form.html', context)

另一种选择:

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

def post(self, request, *args, **kwargs):
    order_form = OrderForm(request.POST)
    context = self.get_context_data()
    item_form = context['item_form']

    if order_form.is_valid() and item_form.is_valid():
        return self.form_valid(order_form)
    else:
        return render(self.request, 'form.html', context)
于 2013-05-07T19:09:02.747 回答