2016-06-08 99 views
1

我有一个问题对象具有一个外键字段的讨论对象。我正在尝试使用讨论ModelForm和问题内联formset来呈现表单。当它向页面呈现空白表单时,一切正常,所有字段都是他们需要的地方。错误是,我有JQuery,允许用户添加更多的问题,如果他们希望通过附加HTML完全相同的其他问题输入和标签与适当的名称值。它最初只是为这个问题提供了三个空的文本区域。在我的视图函数中,我同时保存了讨论模型表单和带有request.POST数据的Inline表单。我可以在POST中看到所有的数据,甚至是附加的问题都存在,但是当我将它们重定向到一个页面以查看新讨论对象及其相关字段的只读版本时,总是只有三个问题,而不是4+。Django嵌入式框架只保存三个对象

视图

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 %} 

回答

3

您需要从管理形式指定的形式总数更新的隐藏字段。每次添加表单时都需要更新它。您可以使用id目标是:

id_form-TOTAL_FORMS 

目前,您的count变量赋值在页面加载(这似乎是3种形式)。 Django正在验证你的formset只接受指定的表格数量,因此会删除所有其他formset表单。所以每次添加一种形式的时候,你需要1

来增加此这里的管理表格上的一些信息:https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform

+1

这工作!感谢Curtis,我知道在我的JQuery中追加所有的html时可能会丢失一些东西,就是这样。 – JBT