首页 文章

Django内联表单只保存三个对象

提问于
浏览
1

我有一个问题对象,它有一个讨论对象的外键字段 . 我试图使用讨论ModelForm和一个问题内联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 %}

1 回答

  • 3

    您需要更新管理表单中的隐藏字段,该字段指定表单总数 . 每次添加表单时都需要更新 . 您可以使用id来定位:

    id_form-TOTAL_FORMS
    

    目前,您的 count 变量是在页面加载时分配的(似乎是3种形式) . Django验证您的formset只接受指定的表单数量,因此丢弃所有其他formset表单 . 因此,每次添加表单时,都需要将其递增1 .

    以下是管理表格的一些信息:https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform

相关问题