【问题标题】:Save a new record from formset instance从表单集实例保存新记录
【发布时间】:2017-01-14 09:59:13
【问题描述】:

我需要从现有的内联表单集实例中保存一条新记录。我设法从父模型 (Order) 中保存了一个新实例,但我不知道如何保存表单集的新实例。代码是这样的:

def order(request, date):
    edit = Order.objects.get(date=date, user=None)
    edit_formset = modelformset_factory(Order_items, fields='__all__', extra=0)
    if request.method == 'POST':
        form = OrderForm(request.POST, instance=edit)
        formset = edit_formset(request.POST, queryset=Order_items.objects.filter(order__date=date))
        if form.is_valid():
            instance = form.save(commit=False)
            instance.pk = None
            instance.user_id = request.user.id
            if formset.is_valid():
                form.save()
                formset.save()
            return HttpResponseRedirect('order')
    else:
        form = OrderForm(instance=edit)
        formset = edit_formset(queryset=Order_items.objects.filter(order__date=date))
        return render(request, 'diner/order.html', {'edit': edit, 'form': form, 'formset': formset})

【问题讨论】:

  • 不确定您所说的“表单集的新实例”是什么意思,因为表单集的意义在于它包含多个表单。但是您提出的代码有什么问题?它做了什么你没有预料到的,或者没有做你所期待的?你得到什么错误?
  • 我需要编辑现有记录并保存一条新记录。问题是代码保存了Order表的一条新记录,但没有在Order_items中新建一条记录。
  • 大概formset_is_valid() 是假的,但在这种情况下你仍然重定向。
  • 好的,我已经设法更正了表单集的有效性。但是保存新记录的问题依然存在

标签: python django inline-formset


【解决方案1】:

你可以试试这个。

if request.method == 'POST':
    form = OrderForm(request.POST, instance=edit) 
    formset = edit_formset(request.POST) 
    If form.is_valid(): 
        instance = form.save(commit=False) 
        instance.pk = None 
        instance.user_id = request.user.id 
        form.save() 
        if formset.is_valid(): 
            add_new = formset.save(commit=False) 
            add_new.instance = instance
            add_new.save() 
            return HttpResponseRedirect('order')

由于在发布请求时您在 formset = edit_formset(request.POST, instance=edit) 中定义实例,因此在保存表单集时,它会保存您命名为 ' 的旧订单的 order_item编辑'不是新的。而 add_new.instance = instance 将有助于创建 formset 新实例。

【讨论】:

  • 不是这样的。 Formset 没有“实例”属性,所以它不会。
【解决方案2】:

好的,我已经找到解决方案了:

if form.is_valid():
    form.cleaned_data['pk'] = None
    if formset.is_valid():
            create_order = Order.objects.create(date=form.cleaned_data['date'], user_id=request.user.id)
            new = formset.save(commit=False)
            for n in new:
                n.id = None
                n.order_id = create_order.id
                create_order.save()
                n.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多