首页 > 解决方案 > 'ManagementForm data is missing or has been tampered with' Django

问题描述

I have created a formset for users to add and remove forms as necessary using Django's empty_form and jQuery. However, when the form is submitted I am being thrown a validation error. I have initialized the ManagementForm, so I am not sure as to what the issue is. Any help would be greatly appreciated.

views.py

def presales(request):

    PresalesFormSet = formset_factory(PresalesForm, extra=1, can_delete=True)

    if request.method == 'POST':

        presales_formset = PresalesFormSet(request.POST)

        if presales_formset.is_valid():
            selected_opportunity = request.POST.get('selected_opportunity')

            for presales_form in presales_formset:

                task_description = request.POST.get('task_description')
                hours = request.POST.get('hours')

                obj = Presales()
                obj.opportunity = selected_opportunity
                obj.taskDescription = task_description
                obj.hours = hours
                obj.save()

    else:
        presales_form = PresalesForm()
        presales_formset = PresalesFormSet()

    context = {'presales_formset': presales_formset, 'presales_form': presales_form, 'my_opportunities': my_opportunities}

    return render(request, 'website/presales.html', context)

template.html

{{ presales_formset.management_form }}
    <form action="{% url 'presales' %}" class="presales_formset" data-total-url="{% url 'presales_total' %}" id="presalesForm"
                  method="post" name="presalesForm">
        <div class="field">
            <label class="label is-large">High Level Task List</label>
        </div>
        {% csrf_token %}

        {% for presales_form in presales_formset.forms %}

            {{ presales_form.field_errors }}
            {{ presales_form.errors }}
    </form>
    {% endfor %}
    <div id="empty_form" style="display: none;">
    {{ presales_formset.empty_form }}

        <form action="{% url 'presales' %}" class="presales_formset" data-total-url="{% url 'presales_total' %}" id="emptyPresalesForm"
                  method="post" name="presalesForm">
        {% csrf_token %}
        </form>
    </div>

forms.py

# special field names
TOTAL_FORM_COUNT = 'TOTAL_FORMS'
INITIAL_FORM_COUNT = 'INITIAL_FORMS'
MIN_NUM_FORM_COUNT = 'MIN_NUM_FORMS'
MAX_NUM_FORM_COUNT = 'MAX_NUM_FORMS'
ORDERING_FIELD_NAME = 'ORDER'
DELETION_FIELD_NAME = 'DELETE'

# default minimum number of forms in a formset
DEFAULT_MIN_NUM = 0

# default maximum number of forms in a formset, to prevent memory exhaustion
DEFAULT_MAX_NUM = 1000


class PresalesForm(forms.Form):
    class Meta:
        model = Presales
        fields = ('selected_opportunity', 'task_description', 'hours', 'selected_engineer_level', 'total_price')

标签: pythondjangodjango-formsformset

解决方案


该 management_form 应该在您的表单集中,例如:

<form action="{% url 'presales' %}" class="presales_formset" data-total-url="{% url 'presales_total' %}" id="presalesForm"
              method="post" name="presalesForm">
    {{ presales_formset.management_form }}
    <div class="field">
        <label class="label is-large">High Level Task List</label>
    </div>
    {% csrf_token %}

    {% for presales_form in presales_formset.forms %}

        {{ presales_form.field_errors }}
        {{ presales_form.errors }}
</form>

推荐阅读