python django django-forms django-class-based-views

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 &rarr;"> </form> <script type="text/javascript"> $(function() { $(''#father-form tr'').formset({ prefix: ''{{ inlines.prefix }}'' }); }) </script>