ModelFormsets en Django es una forma avanzada de manejar múltiples formularios creados usando un modelo y usarlos para crear instancias de modelo. En otras palabras, ModelFormsets son un grupo de formularios en Django. Uno podría querer inicializar múltiples formularios en una sola página, todo lo cual puede involucrar múltiples requests POST, por ejemplo
class GeeksModel(models.Model): title = models.CharField(max_length = 200) description = models.TextField()
Ahora, si uno quiere crear un modelformset para este modelo, se debe usar modelformset_factory. Un formset es una capa de abstracción para trabajar con múltiples formularios en la misma página. Se puede comparar mejor con una cuadrícula de datos.
from django.forms import formset_factory GeeksFormSet = modelformset_factory(GeeksModel)
Creando y usando Django ModelFormsets
Ilustración de renderizar Django ModelFormsets manualmente usando un ejemplo. Considere un proyecto llamado geeksforgeeks
que tiene una aplicación llamada geeks
.
Consulte los siguientes artículos para comprobar cómo crear un proyecto y una aplicación en Django.
En su aplicación geeks, cree un nuevo archivo llamado models.py donde estaría haciendo todos sus modelos. Para crear un modelo de Django, debe usar Django Models. Demostremos cómo,
en su models.py
Ingrese lo siguiente,
# import the standard Django Model # from built-in library from django.db import models # declare a new model with a name "GeeksModel" class GeeksModel(models.Model): # fields of the model title = models.CharField(max_length = 200) description = models.TextField() # renames the instances of the model # with their title name def __str__(self): return self.title
Expliquemos qué está sucediendo exactamente, el lado izquierdo indica el nombre del campo y, a la derecha, define varias funcionalidades de un campo de entrada correspondiente. La sintaxis de un campo se denota como
Sintaxis:
Field_name = models.FieldType(attributes)
Ahora, para crear un formset simple de este formulario, muévase a views.py y cree uno formset_view
como se muestra a continuación.
from django.shortcuts import render # relative import of forms from .forms import GeeksForm # importing formset_factory from django.forms import formset_factory def formset_view(request): context ={} # creating a formset GeeksFormSet = modelformset_factory(GeeksForm) formset = GeeksFormSet() # Add the formset to context dictionary context['formset']= formset return render(request, "home.html", context)
Para representar el formset a través de HTML, cree un archivo html «home.html». Ahora vamos a editartemplates > home.html
<form method="POST" enctype="multipart/form-data"> {% csrf_token %} {{ formset.as_p }} <input type="submit" value="Submit"> </form>
Todo listo para verificar si nuestro conjunto de formularios funciona o no, visite http://localhost:8000/ .
El nuestro modelformset
está funcionando completamente. Aprendamos cómo modificar este formset para usar características adicionales de este formset.
Cómo crear formularios múltiples usando Django ModelFormsets
Los conjuntos de formularios de Django se utilizan para manejar múltiples instancias de un formulario. Uno puede crear múltiples formularios fácilmente usando el extra
atributo de Django Formsets. En geeks/views.py ,
from django.shortcuts import render # relative import of forms from .models import GeeksModel # importing formset_factory from django.forms import modelformset_factory def modelformset_view(request): context ={} # creating a formset and 5 instances of GeeksForm GeeksFormSet = modelformset_factory(GeeksModel, fields =['title', 'description'], extra = 3) formset = GeeksFormSet() # Add the formset to context dictionary context['formset']= formset return render(request, "home.html", context)
El argumento de palabra clave extra
hace múltiples copias del mismo formulario. Si uno quiere crear 5 formularios ingrese extra = 5
y de igual forma para los demás. Visite http://localhost:8000/ para verificar si se crean 5 formularios.
Manejo de múltiples formularios usando Django Formsets
Crear un formulario es mucho más fácil que manejar los datos ingresados en esos campos en el back-end. Intentemos demostrar cómo se pueden usar fácilmente los datos de un formset modelo en una vista. Al intentar manejar formset, los formsets de Django requerían un argumento adicional {{ formset.management_data }} . Para saber más sobre los datos de gestión, Entendiendo el ManagementForm .
en templates/home.html
,
<form method="POST" enctype="multipart/form-data"> <!-- Management data of formset --> {{ formset.management_data }} <!-- Security token --> {% csrf_token %} <!-- Using the formset --> {{ formset.as_p }} <input type="submit" value="Submit"> </form>
Ahora, para verificar cómo y qué tipo de datos se procesan, edite formset_view para imprimir los datos. en geeks/view.py
,
from django.shortcuts import render # relative import of forms from .forms import GeeksForm # importing formset_factory from django.forms import formset_factory def formset_view(request): context ={} # creating a formset and 5 instances of GeeksForm GeeksFormSet = formset_factory(GeeksForm, extra = 3) formset = GeeksFormSet(request.POST or None) # print formset data if it is valid if formset.is_valid(): for form in formset: print(form.cleaned_data) # Add the formset to context dictionary context['formset']= formset return render(request, "home.html", context)
Ahora intentemos ingresar datos en el formset a través de http://localhost:8000/
Presione enviar y los datos se guardarán en GeeksModel donde se ejecuta el servidor. Uno puede usar estos datos de cualquier manera conveniente ahora.
Publicación traducida automáticamente
Artículo escrito por NaveenArora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA