为什么Djangodynamicformset“添加另一个”按钮会复制外键字段?

2024-04-18 22:16:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过instructions将django动态表单集设置到我的项目和我的特定内联表单集

{{Edit}}

目标是提供一种在表单集中添加和删除单个表单的简单方法

{{End edit}}

除了一个包含外键的表单集之外,所有的表单集似乎都可以工作。当我“添加另一个”时,它会复制它下面的字段

在按下“添加另一个”之前: enter image description here

按“添加另一个”后: enter image description here

表格集:

<h3>Services</h3>
<div class="row">  
    {{ services_formset.management_form }}
    {% for formserve in services_formset %}
    {{ formserve.non_field_errors }}
    <div class="container" id="services_formset">
        <div class="row" name="service_form">    
            {% for hidden in formserve.hidden_fields %}
                {{ hidden }}
            {% endfor %}                                         
            {% for field in formserve %}
                {% if field.name != 'index' and field.name != 'invoice'%}
                    <div class="col-sm">                     
                        {{ field.errors }}
                        {{ field|as_crispy_field }}
                        {% if field.help_text %}
                        <p class="help">{{ field.help_text|safe }}</p>
                        {% endif %}
                    </div>
                {% endif %}
            {% endfor %}                
        </div>
     </div> 

javascript:

<script type="text/javascript">
    $(function() {
        $('#services_formset').formset({
            prefix: '{{ formserve.prefix }}'
        });
    })

</script>

编辑: 我使用inlineformset_factory创建它:

ServicesFormset = inlineformset_factory(TransactionsTable, TransSpTable, fields=('service','fee','qty','taxrate','tax','sub'), extra=1, widgets=services_widgets, can_delete=True)

然后,我使用一个函数来实例化它,该函数检查它是创建视图还是详细视图,以及是否是帖子:

context['services_formset'] = get_dynamic_formset(self, ServicesFormset)

def get_dynamic_formset(view, FormSetClass):
    if view.object:
        if view.request.POST:
            dynamic_formset = FormSetClass(view.request.POST, instance=view.object)
        else:
            dynamic_formset = FormSetClass(instance=view.object)
    else:
        if view.request.POST:
            dynamic_formset = FormSetClass(view.request.POST)
        else:
            dynamic_formset = FormSetClass()   
    return dynamic_formset

Tags: indivview表单fieldforifrequest