Наборы форм Django Inline сохраняют только три объекта

У меня есть объект вопроса, который имеет поле внешнего ключа для объекта обсуждения. Я пытаюсь отобразить форму, используя ModelForm для обсуждения и вопрос Inline formset. Когда он выводит пустую форму на страницу, все работает нормально, и все поля находятся там, где они должны быть. Ошибка в том, что у меня есть JQuery, который позволяет пользователю добавлять дополнительные вопросы, если они хотят, добавляя html, точно идентичный другим входным данным вопроса и меткам с соответствующими значениями имен. Первоначально он просто помещает три пустых текстовых поля для вопроса. В моей функции просмотра я сохраняю как форму обсуждения модели, так и встроенную форму с данными request.POST. Я вижу в POST, что все данные, даже добавленные вопросы, есть, но когда я перенаправляю их на страницу, чтобы увидеть версию нового объекта обсуждения и связанных с ним полей только для чтения, всегда есть только три вопроса, вместо 4+.

Посмотреть

def new_discussion(request):
    member = get_member(request)

if request.method == 'POST':
    form = DiscussionForm(data=request.POST)
    QuestionInlineFormSet = inlineformset_factory(Discussion, Question, fields='__all__')

    if form.is_valid():

       created_discussion = form.save(commit=False)
       formset = QuestionInlineFormSet(request.POST, instance=created_discussion)
       if formset.is_valid():
            created_discussion.community = member.community
            created_discussion.save()
            formset.save()

            return HttpResponseRedirect('/user/discussions/')

шаблон

{% extends 'member/discussions.html' %}

{% block extra-head %}
    <script src='//cdn.tinymce.com/4/tinymce.min.js'></script>
    <script>

    var count = {{ questions|length }};

    $(document).ready(function(){
      $('#add_question').on('click', function(e){
            e.preventDefault()
            console.log(count)

            var form = $('.form-data')
            form.append('<div class="col-xs-12 extra-' + count + ' form-group"></div>')
            $('#question-count').val(count)

            var extra = $('.extra-' + count)
            extra.append('<label for="id_question_set-' + count + '-question">Question:</label>')
            extra.append('<textarea cols="40" id="id_question_set-' + count + '-question" maxlength="200" name="question_set-' + count + '-question" rows="10"></textarea>')
            extra.append('<label for="id_question_set-' + count + '-scripture">Scripture:</label>')
            extra.append('<input id="id_question_set-' + count + '-scripture" maxlength="30" name="question_set-' + count + '-scripture" type="text">')
            extra.append('<label for="id_question_set-' + count + '-display_order">Display order:</label>')
            extra.append('<input id="id_question_set-' + count + '-display_order" name="question_set-' + count + '-display_order" type="number" value="1">')
            extra.append('<label for="id_question_set-' + count + '-DELETE">Delete:</label>')
            extra.append('<input id="id_question_set-' + count + '-DELETE" name="question_set-' + count + '-DELETE" type="checkbox">')
            extra.append('<input id="id_question_set-' + count + '-discussion" name="question_set-' + count + '-discussion" type="hidden">')
            extra.append('<input id="id_question_set-' + count + '-id" name="question_set-' + count + '-id" type="hidden">')
            count += 1
        })
    })

    tinymce.init({
        selector: '#id_content',
        plugins : 'media code',
        media_alt_source: true,
        media_poster: false,
        media_dimensions: false
      });

</script>
{% endblock %}

{% block discussion %}

<form method='POST' id='discussion-form'>

    <div class="form-data">

        {% csrf_token %}

        <div class='col-xs-12 form-group'>
            <label for='id_title'>Title</label>
            {{ form.title }}
        </div>

        <div class='col-xs-12 form-group'>
            <label for='mytextarea'>Content</label>
            {{ form.content }}
        </div>

        <div class='col-xs-12 form-group'>
            <label for='id_audio'>Audio</label>
            {{ form.audio }}
        </div>

        <input type="hidden" id="question-count" name="question-count" value='0'>

        <div class="col-xs-12">
            {{ questions }}
        </div>

    </div>

    <button class="btn btn-info" style="margin-left: 15px; margin-bottom: 10px;" id="add_question">Add Question</button>

    <br>

    <div class='btn-wrapper col-xs-12'>

        <input id='save' type='submit' class='btn btn-primary' style="margin-right: 10px;" value='Save' />

        {% if view %}
            <a class='btn btn-primary' style="margin-right: 10px;" href='/user/discussions/edit/{{ discussion.id }}/preview/'>
            View
        </a>
        {% endif %}

        <!-- <input id='preview' type='submit' class='btn btn-primary' style="margin-right: 20px;" value='Preview' /> -->
        <a href="/user/dashboard" class='btn btn-warning'>Back to dashboard</a>

    </div>

</form>

{% block discussion_nav %}

{% endblock %}

{% endblock %}

person TJB    schedule 08.06.2016    source источник


Ответы (1)


Вам необходимо обновить скрытое поле из формы управления, в котором указано общее количество форм. Его необходимо обновлять каждый раз, когда вы добавляете форму. Вы можете настроить таргетинг на это, используя идентификатор:

id_form-TOTAL_FORMS

В настоящее время ваша переменная count назначается при загрузке страницы (что, по-видимому, представляет собой 3 формы). Django проверяет ваш набор форм, чтобы принять только указанное количество форм, поэтому отбрасывает все другие ваши формы набора форм. Поэтому каждый раз, когда вы добавляете форму, вам нужно увеличивать ее на 1.

Вот некоторая информация о форме управления: https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform

person Curtis Olson    schedule 08.06.2016
comment
Это сработало! Спасибо, Кертис, я знал, что, вероятно, я что-то упустил, когда добавлял весь этот html в свой JQuery, и это было все. - person TJB; 08.06.2016