Django ModelForm – Crear formulario a partir de modelos

Django ModelForm es una clase que se utiliza para convertir directamente un modelo en un formulario Django. Si está creando una aplicación basada en una base de datos, es probable que tenga formularios que se correspondan estrechamente con los modelos de Django. Por ejemplo, un modelo y un formulario de registro de usuarios tendrían la misma calidad y cantidad de campos de modelo y campos de formulario. Entonces, en lugar de crear un código redundante para crear primero un formulario y luego asignarlo al modelo en una vista, podemos usar directamente ModelForm. Toma como argumento el nombre del modelo y lo convierte en un Formulario Django. No solo esto, ModelForm ofrece una gran cantidad de métodos y funciones que automatizan todo el proceso y ayudan a eliminar la redundancia de código.

¿Cómo convertir un modelo en un formulario Django?

Para explicar el funcionamiento del proyecto, usaremos project geeksforgeeks , crearemos un modelo y lo mapearemos a los formularios de Django.

Consulte los siguientes artículos para comprobar cómo crear un proyecto y una aplicación en Django.

Ahora cuando tengamos nuestro proyecto listo, crea un modelo en geeks/models.py, 

Python3

# 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()
    last_modified = models.DateTimeField(auto_now_add = True)
    img = models.ImageField(upload_to = "images/")
  
        # renames the instances of the model
        # with their title name
    def __str__(self):
        return self.title

Antes de crear un modelo, registremos nuestra aplicación en el proyecto principal. Vaya al archivo geeksforgeeks/settings.py y agregue la aplicación geeks en la lista INSTALLED_APPS. Si hacemos migraciones antes de este paso nos mostrará un mensaje diciendo que no hay cambios realizados. 

Ahora, ejecute los siguientes comandos para crear el modelo,

Python manage.py makemigrations
Python manage.py migrate

Podemos comprobar que el modelo se ha creado con éxito en http://127.0.0.1:8000/admin/geeks/geeksmodel/add/ . django-modelform-modelPara crear un formulario directamente para este modelo, acceda a geeks/forms.py e introduzca el siguiente código. 

Python3

# import form class from django
from django import forms
 
# import GeeksModel from models.py
from .models import GeeksModel
 
# create a ModelForm
class GeeksForm(forms.ModelForm):
    # specify the name of model to use
    class Meta:
        model = GeeksModel
        fields = "__all__"

Este formulario toma dos campos de argumentos o excluye .

  • campos: se recomienda encarecidamente que establezca explícitamente todos los campos que deben editarse en el formulario utilizando el atributo de campos. Si no lo hace, puede generar fácilmente problemas de seguridad cuando un formulario permite inesperadamente que un usuario establezca ciertos campos, especialmente cuando se agregan nuevos campos a un modelo. Dependiendo de cómo se represente el formulario, es posible que el problema ni siquiera sea visible en la página web. Establezca el atributo de campos en el valor especial ‘__all__’ para indicar que se deben usar todos los campos del modelo.
  • excluir: establezca el atributo de exclusión de la metaclase interna de ModelForm en una lista de campos que se excluirán del formulario. Por ejemplo:
class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ['title']

Finalmente, para completar nuestra estructura MVT, cree una vista que represente el formulario y lo guarde directamente en la base de datos. En geeks/views.py, 

Python3

from django.shortcuts import render
from .forms import GeeksForm
 
def home_view(request):
    context ={}
 
    # create object of form
    form = GeeksForm(request.POST or None, request.FILES or None)
     
    # check if form data is valid
    if form.is_valid():
        # save the form data to model
        form.save()
 
    context['form']= form
    return render(request, "home.html", context)

django-modelform-form

Todo está configurado, ahora visite http://127.0.0.1:8000/ , ahora puede ver que cada campo del modelo se asigna a un campo de formulario y se muestra correspondientemente. Las asignaciones de campo se analizan más adelante en este artículo. Así que ahora intentemos ingresar datos en el formulario y verifiquemos si se guarda en la base de datos. 

django-modelform-enter-data

Presiona enviar y Bingo, el formulario se guarda automáticamente en la base de datos. Podemos verificarlo en http://localhost:8000/admin/geeks/geeksmodel/ .django-modelform-save-model

tipos de campo

La clase de formulario generada tendrá un campo de formulario para cada campo de modelo especificado, en el orden especificado en el atributo de campos. Cada campo de modelo tiene un campo de formulario predeterminado correspondiente. Por ejemplo, un CharField en un modelo se representa como un CharField en un formulario. Un modelo ManyToManyField se representa como un MultipleChoiceField. Aquí está la lista completa de conversiones:

Campo modelo Campo de formulario
Campo automático No representado en la forma
BigAutoField No representado en la forma
BigIntegerField IntegerField con min_value establecido en -9223372036854775808 y max_value establecido en 9223372036854775807.
BinaryField CharField, si es editable, se establece en True en el campo del modelo; de lo contrario, no se representa en el formulario.
campo booleano BooleanField o NullBooleanField si null=True.
CharField CharField con longitud_máxima establecida en la longitud_máxima del campo del modelo y valor_vacío establecido en Ninguno si null=Verdadero.
campo de fecha campo de fecha
Campo de fecha y hora Campo de fecha y hora
campo decimal campo decimal
DuraciónCampo DuraciónCampo
Campo de correo electrónico Campo de correo electrónico
campo de archivo campo de archivo
CampoRutaArchivo CampoRutaArchivo
campo flotante campo flotante
Clave externa ModeloElecciónCampo
campo de imagen campo de imagen
CampoEntero CampoEntero
CampoDirecciónIP CampoDirecciónIP
Campo de dirección IP genérico Campo de dirección IP genérico
MuchosAMuchosCampo ModeloCampo de opción múltiple
NullBooleanField NullBooleanField
CampoEnteroPositivo CampoEntero
CampoEnteroPequeñoPositivo CampoEntero
campo de babosas campo de babosas
SmallAutoField No representado en la forma
Campo de texto CharField con widget=forms.Textarea
Campo de tiempo Campo de tiempo
campo URL campo URL

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 *