Django保存嵌套的表单集时出现列不能为空的错误

0md85ypi  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(124)

有两个嵌套的表单集,它们彼此相关。当我在第二个表单集中增加额外的字段时,我得到错误列不能为空。我将两个表单保存为一个没有问题。
以下是我的错误:
The error
下面是我的表单:

class UserTaskForm(forms.ModelForm):
    
    class Meta:
        model = UserTask
        fields = ['user_id','task_types_id','store_house_id','description']

class TaskSourcesForm(forms.ModelForm):
    class Meta:
        model = TaskSources
        fields = ['product_id', 'product_amount']



TaskSourcesFormSet = modelformset_factory(
    TaskSources,
    fields=('product_id', 'product_amount',),
    extra=2,
)    


UserTaskFormFormSet = modelformset_factory(
    UserTask,
    fields=('user_id','task_types_id','store_house_id','description',),
    extra=1,
)

以下是我的看法:

@login_required(login_url="login")
def addUserTask(request):

    user_task_form = UserTaskFormFormSet(queryset=UserTask.objects.none(),initial=[{'user_id': request.user}])
    formset = TaskSourcesFormSet(queryset=TaskSources.objects.none())

    if request.method == 'POST':
        user_task_form = UserTaskFormFormSet(request.POST)
        formset = TaskSourcesFormSet(request.POST)
        
        if user_task_form.is_valid():
            for form in user_task_form:
                user_task = form.save(commit=False)
                user_task.author = request.user
                user_task.save()
            
            if formset.is_valid():
                for form_data in formset:
                    task_sources = form_data.save(commit=False)
                    task_sources.user_task_id = UserTask(id = user_task.id)
                    task_sources.save()
                   
            messages.success(request,"Task added successfully!")
        return redirect(".")

    context = {
        "user_task_form" : user_task_form,
        "formset" : formset,
    }

    return render(request,"user/addtask.html",context)

如何在一个视图中保存两个模型表单集(相互关联)?我做的时候哪里错了?

kuhbmx9i

kuhbmx9i1#

我怀疑这个问题来自于表单集表单中的空字段。您可以通过以下方式避免空表单:

for form in user_task_form:
            if form.has_changed():
               user_task = form.save(commit=False)

相关问题