Saltar a contenido

Séptima App [Contact] Formularios

Durante las próximas cuatro lecciones nos introduciremos en el mundo de los formularios de Django, obviamente el objetivo será dotar de vida al formulario de contacto de nuestra web:

  • En esta primera lección crearemos la respectiva app y trasladaremos la vista y el template contact que tenemos en Core. Aprenderemos a diseñar el formulario, a utilizarlo en la vista y a mostrarlo en su respectivo template.
  • En la segunda lección veremos cómo procesar y validar sus campos al enviarlo
  • En la tercera lección os mostraré como fusionar el formulario para respetar el diseño del frontend.
  • Para acabar esta serie añadiremos la funcionalidad de enviar emails, configuraremos un email real y lo probaremos.

App Contact

Empecemos creando la app contacto:

python manage.py startapp contact

Trasladamos la vista contacto a la nueva app:

webempresa/contact/views.py

from django.shortcuts import render

def contact(request):
    return render(request, "core/contact.html")

Creamos las url de la app:

webempresa/contact/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.contact, name="contact"),
]

Las añadimos a las url del proyecto:

webempresa/webempresa/urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings

urlpatterns = [
    path('', include('core.urls')),
    path('services/', include('services.urls')),
    path('blog/', include('blog.urls')),
    path('page/', include('pages.urls')),
    path('admin/', admin.site.urls),

    # Paths de pages
    path('contact/', include('contact.urls')),

]

if settings.DEBUG:
    from django.conf.urls.static import static
    urlpatterns += static(
        settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Activamos la app:

webempresa/webempresa/settings.py

INSTALLED_APPS = [
    'contact',
]

Movemos el antiguo template de core\templates\core\contact.html a la app contact\templates\contact\contact.html

Formulario de contacto

El caso es que cuando necesitemos un formulario, Django nos ofrece la posibilidad de crear un diseño de forma muy parecida a cómo se crean los modelos, de manera que él mismo se encargará de generar el HTML resultante. Además nos provee de una serie de métodos para procesarlo y validar sus campos.

Normalmente se crean en un fichero forms.py dentro de la respectiva app, heredando de una clase llamada Form que hay en el módulo forms. Nosotros vamos a crear el nuestro en la app Core, que es la que gestiona la vista Contact:

webempresa/contact/forms.py

from django import forms

class ContactForm(forms.Form):
    pass

Como os he dicho es parecido a crear un modelo, ya que debemos indicar los campos y su tipo. El nuestro tiene tres: un nombre que será una cadena de texto, un email que tiene su propio tipo y el contenido, es lo mínimo necesario para que alguien pueda enviarnos un mensaje y le podamos responder.

webempresa/contact/forms.py

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(
        label="Nombre", required=True)
    email = forms.EmailField(
        label="Email", required=True)
    content = forms.CharField(
        label="Contenido", required=True, widget=forms.Textarea()

Como podéis notar sus campos vienen definidos en el módulo forms en lugar de models y para el nombre se utiliza el atributo label en lugar de verbose_name. Por defecto estos campos se renderizan como tags <input>, pero se pueden cambiar estableciendo un tipo de widget, como en el caso del contenido donde queremos mostrar un tag <textarea>.

Hay campos para todo: cadenas, numéros, emails, fechas, opciones desplegables, ficheros, etc. Os adjunto un enlace por si queréis aprender más.

Sea como sea ya tenemos diseñado el formulario, así que vamos a utilizarlo, pero antes comentaremos el que tenemos en el template contact.html, porque ese es sólo de prueba. Más adelante lo adaptaremos, pero por ahora nos centraremos en lo importante.

Importamos el formulario, creamos una instancia en la vista y la enviamos al template:

\

Ahora en nuestro template contact.html vamos el dibujar el formulario:

¿Habéis visto que fácil es que nos lo dibuje automáticamente?

Por defecto hemos dibujado en formulario como una tabla, de ahí que lo hayamos puesto entre el tag \<table>, pero también se puede dibujar como parágrafos o una lista:

                                        

        

         

Personalmente prefiero la forma de tabla, así que lo dejaré como estaba:

Sin embargo Django no dibuja todo el formulario, sólo los campos. No hay ningún botón para procesarlo, y si inspeccionamos el código veremos también falta el tag \<form>, necesario para crear formularios HTML:

Seguimos en la segunda parte.


Última edición: 25 de Marzo de 2021