Почему django -dynami c -formset 'добавить еще одну кнопку' дублирует поле внешнего ключа? - PullRequest
3 голосов
/ 05 апреля 2020

Я выполнил инструкции , чтобы настроить django -dynami c -formset для своего проекта и моих определенных c встроенных наборов форм.

{{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)

Затем я создаю его экземпляр с помощью функции, которая проверяет, является ли это представление создания или детализации и POST или нет:

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
...