Jquery 在模式表单中提交带有预填充数据的Django内联表单集的正确方法是什么
在我的Django应用程序中,我使用jQueryAjax调用查询数据库表,用json回调数据填充内联表单集 下图是流程开始时可能出现的情况。表单/表单集位于模式中,以节省空间 我希望通过使用ajax提交表单,将用户输入(包括预填充的值)保存在相应的表中 表格为: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
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()