Skip to content

Instantly share code, notes, and snippets.

@martin1007
Last active July 8, 2018 06:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save martin1007/6474f3a7f14540bae729e8b4d31f8ca2 to your computer and use it in GitHub Desktop.
Save martin1007/6474f3a7f14540bae729e8b4d31f8ca2 to your computer and use it in GitHub Desktop.
Django modelformset_factory working with 2 formsets
VIEWS.PY
from django.shortcuts import render
from .forms import modelformset_factory, AssumptionsForm
from .models import Assumptions
def get_assumptions(request):
AssumptionsFormset = modelformset_factory(
Assumptions, form=AssumptionsForm, extra=5)
if request.method == 'POST':
formset1 = AssumptionsFormset(request.POST, prefix='A')
formset2 = AssumptionsFormset(request.POST, prefix='B')
if formset1.is_valid():
for form in formset1:
form.save()
if formset2.is_valid():
for form in formset2:
form.save()
else:
formset1 = AssumptionsFormset(prefix='A')
formset2 = AssumptionsFormset(prefix='B')
return render(request, 'assumptions.html', {'formset1': formset1, 'formset2': formset2})
ASSUMPTIONS.HTML
<div class="form">
<form action="" method="post">
{% csrf_token %}
{{ formset1.management_form }}
{{ formset1.non_form_errors.as_ul }}
<h1>{{formset1.prefix}}</h1>
<table id="formset" class="form">
{% for form in formset1.forms %}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<input type="hidden" name="save" />
{{ formset2.management_form }}
{{ formset2.non_form_errors.as_ul }}
<h1>{{formset2.prefix}}</h1>
<table id="formset" class="form">
{% for form in formset2.forms %}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<input type="hidden" name="save" />
<input type="submit" value="Submit">
</form>
</div>
MODELS.PY
from django.db import models
from django.forms import ModelForm
class Assumptions(models.Model):
Worst = models.FloatField(null=True, blank=True, default=None)
Base = models.FloatField(null=True, blank=True, default=None)
Best = models.FloatField(null=True, blank=True, default=None)
FORMS.PY
from django import forms
from django.forms import modelformset_factory, ModelForm
from .models import Assumptions
class AssumptionsForm(ModelForm):
class Meta:
model = Assumptions
fields = '__all__'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment