0

I want to insert multiple row into my database from form2. Below are my codes

first model.py

class DataPribadiSiswa(models.Model):
   SiswaID = models.AutoField(primary_key=True)
   WaliKelasID=models.CharField(max_length=5,blank=True,null=True)

second model.py

class RiwayatSekolah(models.Model):
   SekolahID=models.AutoField(primary_key=True)
   SiswaID_FK=models.ForeignKey(DataPribadiSiswa,blank=True, null=True)
   SekolahNama=models.CharField(max_length=50,blank=True,null=True)
   SekolahThMasuk=models.CharField(max_length=4,blank=True,null=True)
   SekolahThKeluar=models.CharField(max_length=4,blank=True,null=True)
   SekolahKet=models.TextField(blank=True,null=True)

views.py

def tambah_siswa(request):
   form = datasiswa(request.POST)
   form2 = riwayatsekolah(request.POST)
   FormSet2 = inlineformset_factory(DataPribadiSiswa, RiwayatSekolah, extra=2, fields=('SekolahID','SiswaID_FK','SekolahNama','SekolahThMasuk','SekolahThKeluar','SekolahKet'))
   if request.method == 'POST':
       if form.is_valid():
           siswa_instance = form.save()
           form2 = FormSet2(request.POST, instance=siswa_instance)
           if form2.is_valid():
               form2.save()
           return redirect('index')
   else:
       formall={}
       formall['form'] = datasiswa()
       formall['form2'] = riwayatsekolah()
   return render(request, 'siswa/tambah_siswa.html', formall)

and this is my template

<form action="" method="post">
{% csrf_token %}
<table >
    {{ form2.management_form }}
    {{ form2.as_table }}
</table>
</form>

How to insert multiple row from form2 into database? when i run this code, it just insert one row.

16
  • you can create object of model which is mapped with you form2 and put the field from form2.cleaned_data['field'] and saved the object. Commented Nov 30, 2016 at 2:43
  • Where i put form2.cleaned_data['field'] @vivekpradhan? Commented Nov 30, 2016 at 2:52
  • modelobject.field = form2.cleaned_data['field'] and finally modelobject.save() Commented Nov 30, 2016 at 2:55
  • is field from form2.cleaned_data['field'] name from html code or field name from model? Commented Nov 30, 2016 at 3:19
  • field name from form Commented Nov 30, 2016 at 3:22

1 Answer 1

1

To simplify working with related objects you can use Inline formsets

You can implement it this way:

from django.forms import inlineformset_factory
FormSet2 = inlineformset_factory(DataPribadiSiswa, RiwayatSekolah, extra=2) 

Now in view try this:

def tambah_siswa(request):
    form = datasiswa(request.POST or None)
    FormSet2 = inlineformset_factory(DataPribadiSiswa, RiwayatSekolah, extra=2, fields=('SekolahID','SiswaID_FK','SekolahNama','SekolahThMasuk','SekolahThKeluar','SekolahKet'))
    if request.method == 'POST':
        if form.is_valid():
            siswa_instance = form.save()
            form2 = FormSet2(request.POST or None, instance=siswa_instance) 
            if form2.is_valid():
                form2.save()
            return redirect('index')
    form2 = FormSet2(request.POST or None) 
    formall={}
    formall['form'] = form
    formall['form2'] = form2
    return render(request, 'siswa/tambah_siswa.html', formall)

And in template:

{{ form2.management_form }}
{{ form2.as_table }}

or

{{ form2.management_form }}    
{% for frm in form2 %}
    {{ frm.as_table }}
{% endfor %}
Sign up to request clarification or add additional context in comments.

7 Comments

@Gusan can you show models, view and template code?
When i run it i get this error Calling modelformset_factory without defining 'fields' or 'exclude' explicitly is prohibited, after i change like this FormSet2 = inlineformset_factory(DataPribadiSiswa, RiwayatSekolah, extra=2, fields=('SekolahID','SiswaID_FK','SekolahNama','SekolahThMasuk','SekolahThKeluar','SekolahKet')) and click input button i get this error [u'ManagementForm data is missing or has been tampered with']
@Gusan try to add {{ form2.management_form }} before {{ form2.as_table }} in template.
still not working @neverwalkaloner, i still get the same error [u'ManagementForm data is missing or has been tampered with']
@Gusan did you add {% csrf_token %} before {{ form2.management_form }}? BTW please show template code with formset added.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.