Динамически добавленные формы не сохраняются в inlineformset_factory Django - PullRequest
0 голосов
/ 11 марта 2019

Я какое-то время следил за различными учебниками и пытался понять / собрать их все вместе, чтобы у моего пользователя была возможность динамически добавлять экземпляры для потомка в рамках inlineformset_factory.

Мой проектпростой сотрудник / смены настроены.Моя родительская модель - это модель ManagerChecklist , которую менеджер завершит в конце дня.Дочерняя модель - это модель EmployeeShift , которая содержит информацию о каждом из сотрудников, которые работали в эту смену, и в какие часы они работали.Я хотел бы, чтобы мой менеджер мог динамически добавлять сотрудников в свою форму «контрольного списка менеджера».

views.py

def update_manager_checklist(request, date):
    template_name = 'shifts/checklists/manager_checklist_update.html'
    instance = get_object_or_404(ManagerChecklist, shift__shift_date=date)
    checklist = inlineformset_factory(ManagerChecklist, EmployeeShift,
                                      fields=('employee', 'start_time',
                                              'end_time', 'total_hours_worked',
                                            ),
                                      extra=0, max_num=None)
    if request.method == 'POST':
        formset = checklist(request.POST, instance=instance)
        if formset.is_valid():
            formset.save()
            return redirect('shifts:shift_list')

    formset = checklist(instance=instance)
    return render(request, template_name, {
        'formset': formset,
    })

html:

{{ formset.management_form }}
<div id="form_set">
    {% for form in formset %}
        <table class='no_error'>
            {{ form.as_table }}
        </table>
    {% endfor %}
</div>
<input type="button" value="Add More" id="add_more">
<div id="empty_form" style="display:none">
    <table class='no_error'>
        {{ formset.empty_form.as_table }}
    </table>
</div>

javascript:

<script>
$('#add_more').click(function() {
    var form_idx = $('#id_form-TOTAL_FORMS').val();
    $('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx));
    $('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
});</script>

Javascript отлично работает для визуального добавления форм на страницу - однако они не проверяются, не добавляются и не отправляются явно в views.py.Если я обновляю существующие формы или создаю дополнительную смену сотрудников, используя extra = 1 вместо extra = 0, тогда он корректно проверяет и добавляет это.

Я предполагаю, что мне нужно добавить некоторый код в мои views.py, чтобычто он подберет formset.empty_form, который динамически добавляется?Или, может быть, есть проблема с информацией, которую javascript отправляет в django?

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 12 марта 2019

Нашли!

JavaScript обновлял неправильный TOTAL_FORMS. Вместо id_TOTAL_FORMS это должен был быть id_employeeshift_TOTAL_FORMS.

Я оставлю для справки, так как этот кусок javascript был взят из очень старого ответа переполнения стека, и другие люди могут столкнуться с той же проблемой.

...