【问题标题】:why are prefix-TOTAL_FORMS, prefix-INITIAL_FORMS, prefix-MIN_NUM_FORMS, prefix-MAX_NUM_FORMS of management_form lists?为什么前缀-TOTAL_FORMS、前缀-INITIAL_FORMS、前缀-MIN_NUM_FORMS、前缀-MAX_NUM_FORMS 的management_form 列表?
【发布时间】:2019-11-11 17:10:39
【问题描述】:

下面是从我的表单发送回视图的 POST 数据。这会导致验证错误 ['ManagementForm 数据丢失或已被篡改']

<QueryDict:  {
    "csrfmiddlewaretoken": ["..."],
    "project_title": ["project test"],
    "project_number": ["543219876"],
    "project_status": ["Active"],
    "project_initiation_date": ["2019-10-10"],
    "project_alias": ["alias"],
    "project_description": ["description"],
    "estimated_total_cost": ["100"],
    "project_type": ["Capital"],
    "project_start_date": ["2019-09-16"],
    "project_end_date": ["2019-10-10"],
    "city_department": ["CDD"],
    "fundingsource_set-TOTAL_FORMS": ["2", ""],
    "fundingsource_set-INITIAL_FORMS": ["0", ""],
    "fundingsource_set-MIN_NUM_FORMS": ["0", ""],
    "fundingsource_set-MAX_NUM_FORMS": ["1000", ""],
    "fundingsource_set-0-funding_source_number": ["876543"],
    "fundingsource_set-0-funder": ["cve"],
    "fundingsource_set-0-funder_contact": ["scott"],
    "fundingsource_set-0-contract_number": ["876543"],
    "fundingsource_set-0-phone_0": ["123456789"],
    "fundingsource_set-0-phone_1": [""],
    "fundingsource_set-0-email": ["mar@gmail.com"],
    "fundingsource_set-0-funds_type": ["Loan"],
    "fundingsource_set-0-funding_amount": ["30"],
    "fundingsource_set-0-percentage_of_funding": ["30"],
    "fundingsource_set-0-funding_agency_type": ["Federal"],
    "fundingsource_set-0-is_awarded": ["on"],
    "fundingsource_set-0-is_being_leveraged": ["on"],
    "fundingsource_set-0-funding_doc_type": ["MOU"],
    "fundingsource_set-0-date_funding_doc_submitted": ["2019-10-10"],
    "fundingsource_set-0-date_project_budget_docs_submitted": ["2019-10-10"],
    "fundingsource_set-0-have_funding_reimbursement_requests": ["true"],
    "fundingsource_set-0-date_funding_reimbursement_request_docs_submitted": ["2019-10-10"],
    "fundingsource_set-1-funding_source_number": ["987123"],
    "fundingsource_set-1-funder": ["observian"],
    "fundingsource_set-1-funder_contact": ["aravind"],
    "fundingsource_set-1-contract_number": ["987123"],
    "fundingsource_set-1-phone_0": ["123456678"],
    "fundingsource_set-1-phone_1": [""],
    "fundingsource_set-1-email": ["mar@gmail.com"],
    "fundingsource_set-1-funds_type": ["Loan"],
    "fundingsource_set-1-funding_amount": ["33"],
    "fundingsource_set-1-percentage_of_funding": ["33"],
    "fundingsource_set-1-funding_agency_type": ["Federal"],
    "fundingsource_set-1-is_awarded": ["on"],
    "fundingsource_set-1-is_being_leveraged": ["on"],
    "fundingsource_set-1-funding_doc_type": ["MOU"],
    "fundingsource_set-1-date_funding_doc_submitted": ["2019-10-10"],
    "fundingsource_set-1-date_project_budget_docs_submitted": ["2019-10-10"],
    "fundingsource_set-1-have_funding_reimbursement_requests": ["true"],
    "fundingsource_set-1-date_funding_reimbursement_request_docs_submitted": ["2019-10-10"],
}
>

此表单在 Inline formset 中有 1 个父表单实例和 2 个子表单实例。

'fundingsource_set-TOTAL_FORMS': ['2', ''],
'fundingsource_set-INITIAL_FORMS': ['0', ''],
'fundingsource_set-MIN_NUM_FORMS': ['0', ''],
'fundingsource_set-MAX_NUM_FORMS': ['1000', '']

它们应该是列表吗?如果有,列表中的每一项表示什么?

下面是我用来渲染这个表单集的模板 sn-p

<fieldset class="form-group card card-body">
<h4>Funding Sources</h4>
    <div class="FundingSourceFormset card card-body">
        <h5>Funding Source</h5>
        {{ funding_source_form.management_form }}
        {{ funding_source_form.non_form_erros }}
        {% for form in funding_source_form %}
            <div class="row">
                <div class="col-md-4">
                    <p>{{ form.funding_source_number | as_crispy_field }}</p>
                </div>
                -----
                rendered all formset fields as crispy fields
                -----
            </div>
        {% enfor %}
    </div>
</fieldset>
<fieldset class="form-group">
    <button class="btn btn-outline-info" type="submit">Create Project</button>
</fieldset>
<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>
<script src="/media/jquery.formset.js"></script>
<script type="text/javascript">
    $('.FundingSourceFormset').formset({
        addCssClass: 'btn btn-primary btn-block',
        addText: 'Add additional funding source',
        deleteCssClass: 'btn',
        deleteText: 'Remove this Funding Source',
        prefix: '{{ funding_source_form.prefix }}'
    });
</script>

我做错了吗??

【问题讨论】:

  • 显示模板。
  • 我刚刚在摘要中添加了模板sn-p
  • 根据 django-dynamic-formset 的文档,management_form 应该在您传递给 .formset() 方法的 DOM 元素之外。
  • 工作就像一个魅力!非常感谢!

标签: django python-3.x inline-formset


【解决方案1】:

它不应该是一个列表。

该管理表单具有多个值意味着您可能还会多次发布它。

检查您的模板和/或呈现的 HTML - 我敢打赌您会找到多个 TOTAL_FORMS 等。

【讨论】:

  • 我刚刚添加了用于渲染表单集的模板 sn-p。我没有多次提交表单。
【解决方案2】:

问题在于上面 @DanielRoseman 在 cmets 中提到的 management_form 的位置。

根据 django-dynamic-formset 的文档,management_form 应该在您传递给 .formset() 方法的 DOM 元素之外

新模板sn-p长这样

<fieldset class="form-group card card-body">
<h4>Funding Sources</h4>
    {{ funding_source_form.management_form }}
    {{ funding_source_form.non_form_erros }}
    <div class="FundingSourceFormset card card-body">
        <h5>Funding Source</h5>
        {% for form in funding_source_form %}
            <div class="row">
                <div class="col-md-4">
                    <p>{{ form.funding_source_number | as_crispy_field }}</p>
                </div>
                -----
                rendered all formset fields as crispy fields
                -----
            </div>
        {% enfor %}
    </div>
</fieldset>
<fieldset class="form-group">
    <button class="btn btn-outline-info" type="submit">Create Project</button>
</fieldset>
<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>
<script src="/media/jquery.formset.js"></script>
<script type="text/javascript">
    $('.FundingSourceFormset').formset({
        addCssClass: 'btn btn-primary btn-block',
        addText: 'Add additional funding source',
        deleteCssClass: 'btn',
        deleteText: 'Remove this Funding Source',
        prefix: '{{ funding_source_form.prefix }}'
    });
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多