2016-06-08 3 views
1

토론 객체에 외래 키 필드가있는 질문 객체가 있습니다. 토론 ModelForm 및 질문 인라인 formset을 사용하여 양식을 렌더링하려고합니다. 빈 폼을 페이지에 렌더링하면 모든 것이 잘 작동하고 모든 필드가 있어야합니다. 오류는 적절한 질문 값을 가진 다른 질문 입력 및 레이블과 정확히 동일한 html을 추가하여 사용자가 더 많은 질문을 추가 할 수 있도록하는 JQuery가 있다는 것입니다. 원래는 질문에 대해 빈 텍스트 영역 세 개를 넣었습니다. 내보기 기능에서 토론 모델 양식 및 인라인 양식을 request.POST 데이터로 저장합니다. POST에서 모든 데이터, 심지어 추가 된 질문이 있음을 알 수 있습니다. 그러나 새 토론 객체 및 관련 필드의 읽기 전용 버전을보기 위해 페이지로 리디렉션하면 항상 세 가지 질문 만 있습니다. 4+ 대신.장고 인라인 formsets는 세 개의 객체 만 저장합니다.

보기

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 양식을 삭제합니다. 일 https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform

+1

: 그래서 당신이 양식을 추가 할 때마다, 당신은 여기에 관리 양식에 대한 몇 가지 정보가입니다 1.

에 의해이 증가합니다! Curtis에게 감사드립니다. JQuery에서 html을 모두 추가 할 때 누락 된 것이 있다는 것을 알았습니다. – JBT

관련 문제