2016-03-29 19 views
0

Django FormSet'e dinamik olarak bir form ekleyerek JavaScript/jQuery'yi kullanarak bir FormSet'i değiştiriyorum. Örneğin, bir kullanıcının eğitimini soran bir formla başladım. Kullanıcı daha sonra orta öğretim ile ilgili bilgileri girmek için bir özdeş form eklemek için bir ekleme düğmesine basabilir (ör. Ilkokul). Form, tarayıcıya eklenir ve veri girebilirim, ancak verileri POST ettiğimde, sadece formun FormSet içinde, tarayıcıdaki ikinci formdaki bilgileri içeren bir formunu gösterir.Dinamik olarak eklenen Django FormSet verileri gönderilmiyor

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

SONRASI BİLGİ

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' 

Sonra söyleyerek bir hata alıyorum. İşte

kod alakalı parçalarıdır: (. Birlikte ve aynı sonucu form.has_changed() parça olmadan denedim İşte)

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) 

Şablon build_profile.html

<h2>Education</h2> 
{{ edu_formset.management_form }} 
{% for form in edu_formset.forms %} 
    <div id="{{ form.prefix }}-row" class="dynamic-form"> 
     {{ form|crispy }} 
     <div {% if forloop.first %} class="hidden" {% endif %}> 
      <button type="button" class="btn btn-default btn-sm delete-row"> 
       <span class="glyphicon glyphicon-minus" aria-hidden="true"></span> 
      </button> 
     </div> 
    </div> 
{% endfor %} 
<div class="btn-group btn-group-xs" role="group" aria-label="..."> 
    <button type="button" class="btn btn-default add-row"> 
     <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 
    </button> 
</div> 

build_profile.js Neyi yanlış yapıyorum

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') 
    }); 

}); 

(dinamik FormSet form eklemesini kodu)?

+0

Birkaç sorum var. 1. Formunuz için html'inizde, 0-index form kümenizdeki alanlar için değerler vardır. Bunlar nereden geliyor? 2. Management_form alanları sizde veri gönderiyor mu? Gönderi verilerinizin neye benzediğini bize gösterir misiniz? 3. Göndermeyi denediğinizde hatayı alıyor musunuz, yoksa yalnızca bir form eklediyseniz mi? –

+0

@RobVezina: Sorgumu, daha önce eklediğim baskı bildirimi yerine posta verilerimi de içerecek şekilde düzenledim. Tarayıcıda her ikisinin de doldurulmuş olduğu iki form vardı, ancak yalnızca bir tanesi posta verisinde görünmektedir. Bir form ekledim ya da eklemedim, göndermeye çalıştığımda hata alıyorum. – eswens13

cevap

0

ValidationError'ı alıyorsunuz, çünkü edu_TOTAL-FORMS = 2 ve form kümesinden yalnızca 1 form posta kodunuzda bulunuyor. Tarayıcıda kaynağı görüntüleyin ve formlarınızın adlarının doğru bir şekilde ön eklendiğinden emin olun. Her iki formun da edu-0 önekine sahip olduğu ve formda sadece sonuncusunu gönderdiğinizde olduğu görülüyor.

+0

Cevabınız için teşekkür ederiz. Öneklerin atanmasıyla ilgili bir sorun oluştu. Sanırım bunu şimdi değiştirdim, böylece ikinci bir form eklendiğinde, önek artık 'edu-0' yerine 'edu-1'. Ancak, yayınladığım zaman, 'edu-1' öneki ile gelen tek şey 'edu-1-id' değişkenidir. Ayrıca, 'edu-0' ile öncelenen posta verileri, tarayıcıdaki ikinci formdan gelir ve ilk değil. Benim "edu-TOTAL-FORMS" 2 (iki form göndermeye çalıştığımdan bu yana olması gerektiğinden eminim). Hala aynı hata mesajını alıyorum. . . – eswens13

+0

Javascript'i sayfadan kaldırarak başlayacağım. Formset'inizde birden çok formla çalışın. Sadece javascript olmadan çalıştığından eminseniz, javascript işlevselliğini tekrar ekleyiniz ve bu bölümün hatalarını ayıklamaya başlayınız. –

+0

Evet, muhtemelen haklısınız. Bir atış yapacağım ve neler olduğunu göreceğim. – eswens13

İlgili konular