【问题标题】:Multiple Formsets on Same Page Submission through Ajax通过 Ajax 提交同一页面上的多个表单集
【发布时间】: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


    【解决方案1】:

    我终于通过在相同的&lt;form&gt; 标记下包含两个表单集来解决它,如下所示:

    <form action="{% url 'add-newly-recruited-officers-step-2' %}" method="POST" id="form">
        {% csrf_token %}
    
        <div id="messages1"></div>  
        {{ spousesformset.management_form }}
        <!-- First Fomset Goes Here -->
    
        {{ childrenformset.management_form }}
        <!-- First Fomset Goes Here -->
    
        <button type="submit" id="" class="btn btn-block btn-primary">Sumbit</button>
    </form>
    

    以及AJAX/JQUERY代码如下:

    <script type="text/javascript">
        $(document).ready(function(){
            var form = $('#form');
    
            form.submit(function (e) {
                e.preventDefault();
                $.ajax(
                    { 
                        data: $(this).serialize(), 
                        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);
                        }
                    }
                );
            });
        });
    </script>
    

    所以主要问题是:将每个表单集放在自己的form 标签下会带来序列化以及视图如何处理数据的问题;特别是当两个表单具有相同的操作属性时。

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2017-09-14
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多