2016-03-29 14 views
0

投稿されていないDjangoのフォームセットのデータを追加しました。たとえば、ユーザーの教育について質問するフォームから始めます。ユーザは、追加ボタンを押して、同じフォームを追加して、中等教育(例えば、大学院)に関する情報を入力することができます。フォームがブラウザに追加されると、Iは、入力データを得るが、私は、データを投稿すると、それだけブラウザで第二の形態からの情報をフォームセット内の1つの形態を示しています。は動的に私が動的にDjangoのフォームセットにフォームを追加してJavaScript/jQueryのを使用してフォームセットを変更しています

ValidationError: [u'ManagementForm data is missing or has been tampered with']

POSTデータは

edu-0-degree u'Doctorate' 
first_name u'User' 
last_name u'One' 
Submit u'Submit' 
edu-0-date_started u'01/01/12' 
edu-MIN_NUM_FORMS u'0' 
edu-0-school u'School Two' 
edu-INITIAL_FORMS u'0' 
edu-MAX_NUM_FORMS u'1000' 
edu-0-date_finished u'01/01/16' 
edu-0-id u'' 
edu-TOTAL_FORMS u'2' 
csrfmiddlewaretoken u'qgD2supjYURWoKArWOmkiVRoBPF6Shw0' 

私はその後、というエラーを取得しています。ここ

コードの関連部分である:(私は、同じ結果にform.has_changed()ピースなしに試みたここ)

views.py

def build_profile(request): 
    EducationFormset = modelformset_factory(EducationModel, AddEducationForm, extra=1) 

    if request.method == "POST": 

     education_formset = EducationFormset(request.POST, prefix='edu') 
     for form in education_formset: 
      if form.is_valid() and form.has_changed(): 
       education = EducationModel(
        school = form.cleaned_data['school'], 
        date_started = form.cleaned_data['date_started'], 
        date_finished = form.cleaned_data['date_finished'], 
        degree = form.cleaned_data['degree'], 
        user = current_user 
       ) 
       education.save() 

     return HttpResponseRedirect(reverse('private', args=[current_user.username])) 

    context = { 
     'edu_formset' : forms['education'], 
    } 

    return render(request, "build_profile.html", context) 

build_profile.html テンプレート10

build_profile.js私が間違って何をやっている

function updateElementIndex(el, prefix, ndx) { 

    var id_regex = new RegExp('(' + prefix + '-\\d+)'); 
    var replacement = prefix + '-' + ndx; 
    if ($(el).attr("for")) $(el).attr("for", $(el).attr("for").replace(id_regex, replacement)); 
    if (el.id) el.id = el.id.replace(id_regex, replacement); 
    if (el.name) el.name = el.name.replace(id_regex, replacement); 

} 

function addForm(btn, prefix) { 

    var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val()); 
    var row = $('.dynamic-form:first').clone(true).get(0); 
    $(row).removeAttr('id').insertAfter($('.dynamic-form:last')).children('.hidden').removeClass('hidden'); 
    $(row).children().not(':last').children().each(function() { 
     updateElementIndex(this, prefix, formCount); 
     $(this).val(''); 
    }); 
    $(row).find('.delete-row').click(function() { 
     deleteForm(this, prefix); 
    }); 
    $('#id_' + prefix + '-TOTAL_FORMS').val(formCount + 1); 
    return false; 

} 

function deleteForm(btn, prefix) { 

    $(btn).parents('.dynamic-form').remove(); 
    var forms = $('.dynamic-form'); 
    $('#id_' + prefix + '-TOTAL_FORMS').val(forms.length); 
    for (var i=0, formCount=forms.length; i<formCount; i++) { 
    $(forms.get(i)).children().not(':last').children().each(function() { 
     updateElementIndex(this, prefix, i); 
    }); 
} 
return false; 

} 

$(document).ready(function() { 

    $('.add-row').click(function() { 
     return addForm(this, 'edu') 
    }); 

    $('.delete-row').click(function() { 
     return deleteForm(this, 'edu') 
    }); 

}); 

(動的フォームセットにフォームを追加するコード)?

+0

私はカップルの質問があります。 1.フォームのhtmlには、0インデックスのformsetのフィールドの値があります。そこから来ているのはどこですか? 2.あなたのmanagement_formフィールドにデータを投稿していますか?投稿データがどのように表示されるか教えてください。 3.投稿しようとするたびにエラーが表示されるのですか、フォームを追加した場合にのみ表示されますか? –

+0

@RobVezina:私は私のポストデータではなく、私が以前に含まれていたprint文を含めるように私の質問を編集しました。ブラウザには2つのフォームが記入されていましたが、投稿データには1つしか表示されていないようです。フォームを追加したかどうかにかかわらず、投稿しようとするたびにエラーが表示されます。 – eswens13

答えて

0

edu_TOTAL-FORMS = 2とフォームセットからわずか1フォームはあなたのポストの引数であるため、あなたはValidationErrorをを取得しています。ブラウザでソースを表示し、フォームの名前に適切な接頭辞が付いていることを確認してください。どちらのフォームにもedu-0プレフィックスが付いているように見えます。最後に送信したフォームのみが投稿されます。

+0

ありがとうございます。プレフィックスの割り当てに問題がありました。私は今、それを変更して、2番目のフォームが追加されると、接頭辞は 'edu-0'の代わりに 'edu-1'になるように変更したと思います。しかし、私が投稿すると、 'edu-1'という接頭辞が付いた唯一のものは 'edu-1-id'変数です。また、 'edu-0'のプレフィックスが付いたポストデータは、ブラウザの2番目のフォームから取得され、最初のポストデータではありません。私の 'edu-TOTAL-FORMS'は2です(私は2つの書式を提出しようとしているので、それはすべきです)。私はまだ同じエラーメッセージが表示されています。 。 。 – eswens13

+0

私は、ページからjavascriptを削除することから始めます。フォームセット内の複数のフォームで作業してください。あなたがjavascriptなしで動いていると確信している時だけ、javascript機能を追加して、その部分のデバッグを開始するべきです。 –

+0

あなたはおそらく正しいでしょう。私はそのショットを与え、何が起こっているのか見ていきます。 – eswens13

関連する問題