토론 객체에 외래 키 필드가있는 질문 객체가 있습니다. 토론 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 %}
: 그래서 당신이 양식을 추가 할 때마다, 당신은 여기에 관리 양식에 대한 몇 가지 정보가입니다 1.
에 의해이 증가합니다! Curtis에게 감사드립니다. JQuery에서 html을 모두 추가 할 때 누락 된 것이 있다는 것을 알았습니다. – JBT