Django ModelFormSets

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 geeksforgeeksque 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.pyIngrese 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_viewcomo 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/ .
django-modelformsets

El nuestro modelformsetestá 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 extraatributo 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 extrahace múltiples copias del mismo formulario. Si uno quiere crear 5 formularios ingrese extra = 5y de igual forma para los demás. Visite http://localhost:8000/ para verificar si se crean 5 formularios.
django-modelfornsets-extra-keyword

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/
django-modelformsets-use-data

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.
django-model-formset-result

Publicación traducida automáticamente

Artículo escrito por NaveenArora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *