Jquery 在模式表单中提交带有预填充数据的Django内联表单集的正确方法是什么

Jquery 在模式表单中提交带有预填充数据的Django内联表单集的正确方法是什么,jquery,django,django-models,django-forms,inline-formset,Jquery,Django,Django Models,Django Forms,Inline Formset,在我的Django应用程序中,我使用jQueryAjax调用查询数据库表,用json回调数据填充内联表单集 下图是流程开始时可能出现的情况。表单/表单集位于模式中,以节省空间 我希望通过使用ajax提交表单,将用户输入(包括预填充的值)保存在相应的表中 表格为: class mappedTargModelForm(forms.ModelForm): class Meta: model = mappedTargModel fields = ('mapper

在我的Django应用程序中,我使用jQueryAjax调用查询数据库表,用json回调数据填充内联表单集

下图是流程开始时可能出现的情况。表单/表单集位于模式中,以节省空间

我希望通过使用ajax提交表单,将用户输入(包括预填充的值)保存在相应的表中

表格为:

class mappedTargModelForm(forms.ModelForm):
    class Meta:
        model = mappedTargModel
        fields = ('mapper_doc_type', 'mapper_name', 'mapper_target_model', 'mapper_long_text')
        widgets = {
            'mapper_doc_type': forms.TextInput(...),
            'mapper_name': forms.TextInput(...),
            'mapper_target_model': forms.TextInput(...),
            'mapper_long_text': forms.Textarea(...),
            }

class mappedTargFieldsForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(mappedTargFieldsForm, self).__init__(*args, **kwargs)
        self.auto_id = False

    class Meta:
        model = mappedTargFields
        fields = ('mapped_field', 'mapped_field_verb_name', 'mapped_field_col_name', 'mapped_field_fk_table')

        widgets = {
            'mapped_field': forms.TextInput(...),
            'mapped_field_verb_name': forms.TextInput(...),
            'mapped_field_col_name': forms.TextInput(...),
            'mapped_field_fk_table': forms.TextInput(...),

            }
        exclude = ()

CreateMappedTargFieldsFormset = inlineformset_factory(
    mappedTargModel,
    mappedTargFields,
    form=mappedTargFieldsForm,
    extra=2,
    can_delete=False)
改编自()的视图如下所示:

class AjaxableResponseMixin:
    """
    Mixin to add AJAX support to a form.
    Must be used with an object-based FormView (e.g. CreateView)
    """
    def form_invalid(self, form):
        response = super().form_invalid(form)
        if self.request.is_ajax():
            return JsonResponse(form.errors, status=400)
        else:
            return response

    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        response = super().form_valid(form)
        if self.request.is_ajax():
            data = {
                'pk': self.object.pk,
            }
            return JsonResponse(data)
        else:
            return response


class mapperObjCreateView(AjaxableResponseMixin, CreateView):
    model = mappedTargModel
    form_class = mappedTargModelForm

    def clean_status(self):
        return self.instance.status
    
    def get_context_data(self, **kwargs):
        data = super(mapperObjCreateView, self).get_context_data(**kwargs)
        if self.request.POST:
            data['mapped_fields'] = CreateMappedTargFieldsFormset(self.request.POST, self.request.FILES)
        else:
            data['mapped_fields'] = CreateMappedTargFieldsFormset()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        mapped_fields = context['mapped_fields']
        with transaction.atomic():

            if mapped_fields.is_valid():
                self.object = form.save()                
                mapped_fields.instance = self.object
                mapped_fields.save()

            else:
                context.update({'mapped_fields': mapped_fields})
                return self.render_to_response(context)

        return super(mapperObjCreateView, self).form_valid(form)
按照当前的安排,表单在验证时返回错误


应采取哪些步骤来确保表单/表单集中的值在提交时保存到相应的表中?

可能您错过了commit=False并将表单中的多对多字段保存为valid

下面是保存表单和表单集的方法


可能您错过了commit=False,并将多对多字段保存在表单\u valid中

下面是保存表单和表单集的方法

if mapped_fields.is_valid():
      self.object = form.save(commit=False)                
      mapped_fields.instance = self.object
      mapped_fields.save()
      mapped_fields.save_m2m()