python - Formas mĂșltiples y conjuntos de formas en CreateView
django django-forms (1)
Tengo 2 modelos, Father
e Son
.
Tengo una página para registrarme Father
. En la misma página tengo un formset para registrar a Son
.
En la página tiene un botón "más" para agregar otro Father
y su Son
respectivo en la misma página.
¿Alguien tiene algún ejemplo utilizando CreateView
?
Las vistas basadas en clases aún son nuevas, así que escribiré esto. El proceso es simple:
Primero, crea las formas para tus objetos. Una de las formas se repetirá. No hay nada especial que hacer aquí.
class SonInline(ModelForm):
model = Son
class FatherForm(ModelForm):
model = Father
Luego, crea tu formset
:
FatherInlineFormSet = inlineformset_factory(Father,
Son,
form=SonInline,
extra=1,
can_delete=False,
can_order=False
)
Ahora, para integrarlo con tu CreateView
:
class CreateFatherView(CreateView):
template_name = ''father_create.html''
model = Father
form_class = FatherForm # the parent object''s form
# On successful form submission
def get_success_url(self):
return reverse(''father-created'')
# Validate forms
def form_valid(self, form):
ctx = self.get_context_data()
inlines = ctx[''inlines'']
if inlines.is_valid() and form.is_valid():
self.object = form.save() # saves Father and Children
return redirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))
def form_invalid(self, form):
return self.render_to_response(self.get_context_data(form=form))
# We populate the context with the forms. Here I''m sending
# the inline forms in `inlines`
def get_context_data(self, **kwargs):
ctx = super(CreateFatherView, self).get_context_data(**kwargs)
if self.request.POST:
ctx[''form''] = FatherForm(self.request.POST)
ctx[''inlines''] = FatherInlineFormSet(self.request.POST)
else:
ctx[''form''] = Father()
ctx[''inlines''] = FatherInlineFormSet()
return ctx
Finalmente, aquí está la plantilla:
La parte clave es el complemento jquery django-dynamic-formset que continúa agregando nuevos formularios en línea:
<form id="father-form" method="POST" enctype="multipart/form-data" action=".">
{% csrf_token %}
<div class="row">
{% for f in form %}
<div class="span3">{{ f.label }}<br />{{ f }}
{% if f.errors %}
{% for v in f.errors %}
<br /><span style="color:red;">{{ v }}</span>
{% endfor %}
{% endif %}
</div>
{% endfor %}
</div>
<hr />
<h2>Sons:</h2>
<table class="table-striped">
<table>
{% for f2 in inlines %}
<tr id="{{ f2.prefix }}-row">
{% for i in f2 %}
<td>
{{ i }}{% if i.errors %}<span style="color:red;">{{ i.errors }}</span>{% endif %}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{{ inlines.management_form }}
<input type="submit" class="btn btn-primary" value="Go Go Gadget →">
</form>
<script type="text/javascript">
$(function() {
$(''#father-form tr'').formset({
prefix: ''{{ inlines.prefix }}''
});
})
</script>