首页 > 解决方案 > django:使用表单集更新 dabatase 表

问题描述

我对表单集感到困惑。我构建了一个表单和一个视图来插入一个工作正常的数据库表行,并且我只是在视图中构建了一个表单集,以便能够一次插入多行。我的问题是表单集似乎不起作用。数据库中没有任何变化。

这是我的表格的样子:

class ProcurementOperationRecordForm(forms.ModelForm):
   
    class Meta:
        model = replenishment
        fields = ('Id', 'Quantity', 'NetAmount', 'Supplier', 'SellPrice')

这是我以前的看法:

#def New_Purchase(request):
    #if request.method == 'POST':
        #form = ProcurementOperationRecordForm(request.POST)
        
        #if form.is_valid():
            
            #form.save()
            
        #quantity = form.cleaned_data.get('Quantity')
        #id = form.cleaned_data.get('Id')
        #update = replenishment.objects.filter(Id = id).update(StockOnOrder =+ quantity)
        #update2 = Item2.objects.filter(reference = id).update(en_cours_de_reception =+ quantity)
        #quantity = form.cleaned_data.get('Quantity')
        #id = form.cleaned_data.get('Id')
        #update = replenishment.objects.filter(Id = id).update(StockOnOrder = (StockOnOrder + quantity))
        
        #return redirect('/dash2.html') 
    #else:
        #form = ProcurementOperationRecordForm()
            
    #context = {'form': form,}
            
    #return render(request, 'new_purchase.html', context)

这是我的表单集视图的样子:

def New_Purchase(request):
    context = {}
    form = formset_factory(ProcurementOperationRecordForm, extra = 3)
    formset = form()
    context['formset'] = formset
    
    return render(request, 'new_purchase.html', context)

我不知道该怎么做才能使这个表单集起作用,有人有线索可以解除这种情况吗?

更新:我已经修改了我的表单集:

ef New_Purchase(request):
    context = {}
    form = formset_factory(ProcurementOperationRecordForm, extra = 3)
    
    if request.method == POST:
        
        formset = form(request.POST)
        if formset.is_valid():
            formset.save()
            
        quantity = form.cleaned_data.get('Quantity')
        id = form.cleaned_data.get('Id')
        update = replenishment.objects.filter(Id = id).update(StockOnOrder =+ quantity)
        update2 = Item2.objects.filter(reference = id).update(en_cours_de_reception =+ quantity)
            
            
        
        return redirect('/dash2.html') 
    
    else:
        form = formset_factory(ProcurementOperationRecordForm, extra = 3)
        
    
        context['formset'] = form
    
        return render(request, 'new_purchase.html', context)

但现在我得到了错误:

AttributeError at /new_purchase.html
'ProcurementOperationRecordFormFormSet' object has no attribute 'save'

更新 2:

我得到它有点工作这样做:

def New_Purchase(request):
    context = {}
    form = modelformset_factory(replenishment, form=ProcurementOperationRecordForm, max_num= 4,extra = 3)
 
    if request.method == 'POST':
        formset = form(request.POST)
        if formset.is_valid():
            formset.save()
            
        quantity = form.cleaned_data.get('Quantity')
        id = form.cleaned_data.get('Id')
        update = replenishment.objects.filter(Id = id).update(StockOnOrder =+ quantity)
        update2 = Item2.objects.filter(reference = id).update(en_cours_de_reception =+ quantity)

        return redirect('/dash2.html') 
    
    else:
        form = modelformset_factory(replenishment, form=ProcurementOperationRecordForm, extra = 3)
        
    
        context['formset'] = form
    
        return render(request, 'new_purchase.html', context)

尽管我尝试指定文档中提到的最大行参数,但此视图会输出整个补货表内容。我试图让只有 3 或 4 个空行将它们插入到补货表中。任何帮助将不胜感激!

标签: pythondjango

解决方案


您的表单和表单集之间有两个主要区别。当您使用表单时,您会为表单提供用户数据form = ProcurementOperationRecordForm(request.POST),而当您使用表单集时,您不会。将您的代码更改为formset = form(request.POST)

并且您检查用户数据并将其保存到数据库中,如果它是正确的

if form.is_valid():
            form.save()

对表单集做同样的事情

if formset.is_valid():
    formset.save()

你需要formset_factory改为modelformset_factory

modelformset_factory(replenishment, form=ProcurementOperationRecordForm, extra = 3)

当您修改代码时,您也需要修改更新。您需要为表单集中的每个表单执行此操作

for check_form in formset:
        quantity = check_form .cleaned_data.get('Quantity')
        id = check_form .cleaned_data.get('Id')
        update = replenishment.objects.filter(Id = id).update(StockOnOrder =+ quantity)
        update2 = Item2.objects.filter(reference = id).update(en_cours_de_reception =+ quantity)

推荐阅读