【发布时间】:2020-05-20 10:57:04
【问题描述】:
所以我在同一页面上呈现了两个表单集,我打算通过 AJAX 提交。问题是每当我尝试提交表单时,都会收到错误消息:
code='missing_management_form',
django.core.exceptions.ValidationError: ['ManagementForm data is missing or has been tampered with']
我已尝试更改前缀并在模板中添加管理表单标签,但仍然没有更改。 这是我的 forms.py;
from .models import Declaration, Spouse, Child
from django import forms
from django.forms import inlineformset_factory
from django.contrib.auth import get_user_model
User = get_user_model()
class ChildrenForm(forms.ModelForm):
class Meta:
model = Child
fields = ['declarant','surname', 'first_name', 'other_names']
class SpousesForm(forms.ModelForm):
class Meta:
model = Spouse
fields = ['declarant','surname', 'first_name', 'other_names']
SpousesFormSet = inlineformset_factory(User, Spouse, form=SpousesForm, extra=1)
ChildrenFormSet = inlineformset_factory(User, Child, form=ChildrenForm, extra=1)
还有观点:
def add_newly_recruited_officers_step_2(request):
if request.POST:
if request.is_ajax:
spousesformset = SpousesFormSet(request.POST, instance=request.user)
childrenformset = ChildrenFormSet(request.POST, instance=request.user)
if spousesformset.is_valid() and childrenformset.is_valid():
return JsonResponse({'success': "Data Saved Successfully"})
else:
return JsonResponse({'error': {'spousesformset': spousesformset.errors, 'childrenformset': childrenformset.errors}})
else:
spousesformset = SpousesFormSet(instance=request.user)
childrenformset = ChildrenFormSet(instance=request.user)
context = {
'spousesformset': spousesformset,
'childrenformset': childrenformset,
}
return render(request, 'declarations/newly_recruited/form_step_2.html', context)
网址路径为:
path('add-newly-recruited/step2/', add_newly_recruited_officers_step_2, name='add-newly-recruited-officers-step-2'),
还有模板:
<!-- Form 1-->
<form action="{% url 'add-newly-recruited-officers-step-2' %}" method="POST" id="form1">
{% csrf_token %}
{{ spousesformset.management_form }}
<table class="table">
{% for form in spousesformset.forms %}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr>
</thead>
{% endif %}
<tr class="spouses_formset_row">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</form>
<!-- Form 2-->
<form action="{% url 'add-newly-recruited-officers-step-2' %}" method="POST" id="form2">
{% csrf_token %}
{{ childrenformset.management_form }}
<table class="table">
{% for form in childrenformset.forms %}
{{form.id}}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr>
</thead>
{% endif %}
<tr class="children_formset_row">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</form>
<button type="button" id="submit_btn" class="btn btn-block btn-primary">Sumbit</button>
最后是 JQuery/AJAX 代码:
<script>
$(document).ready(function(){
var form1 = $('#form1');
var form2 = $('#form2');
var data1 = form1.serialize();
var data2 = form2.serialize();
form1.submit(function (e) {
e.preventDefault();
$.ajax(
{
data: data1,
type: $(this).attr('method'),
url: $(this).attr('action'),
success: function(response) {
if(response['success']) {
$("#messages1").html(
"<div class='alert alert-success'>\
<button type='button' class='close alert-btn' data-dismiss='alert' aria-label='Close'><span aria-hidden='true'>×</span></button>\
"+ response['success'] + "\
</div>"
);
}
if(response['error']) {
$("#messages1").html("<div class='alert alert-danger'>" +response['error'] +"</div");
}
console.log(response['error'])
},
error: function (request, status, error) {
console.log(request.responseText);
}
}
);
});
form2.submit(function (e) {
e.preventDefault();
$.ajax(
{
data: data2,
type: $(this).attr('method'),
url: $(this).attr('action'),
success: function(response) {
if(response['success']) {
$("#messages2").html(
"<div class='alert alert-success'>\
<button type='button' class='close alert-btn' data-dismiss='alert' aria-label='Close'><span aria-hidden='true'>×</span></button>\
"+ response['success'] + "\
</div>"
);
}
if(response['error']) {
$("#messages2").html("<div class='alert alert-danger'>" +response['error'] +"</div");
}
console.log(response['error'])
},
error: function (request, status, error) {
console.log(request.responseText);
}
}
);
});
$('#submit_btn').click(function(){
// alert('Clicked');
$('#form1').submit();
$('#form2').submit();
});
});
</script>
我可能会遗漏什么?或添加我不应该添加的地方? :-)
【问题讨论】:
标签: django ajax django-forms