6 6_API_Forms
jp.av.dev edited this page 2021-07-02 22:17:18 -04:00
This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Ir a: Repositorio, Envio de Mails,
Proyecto Web Completo


API Forms

Creación de formularios con API Forms

Simplifica la creación de formularios e incluye validacion.

API Forms doc
Indice Forms Api doc

Crear /TiendaOnline/gestionPedidos/forms.py

from django import forms

class FormContacto(forms.Form):
    asunto = forms.CharField(max_length=35, required=False, initial='Contacto')
    email  = forms.EmailField(max_length=35)
    msj    = forms.CharField(widget=forms.Textarea(attrs={'rows': 5, 'cols': 26}))

🔸python3 manage.py shell

(InteractiveConsole)
>>> from gestionPedidos.forms import FormContacto
>>> 
>>> miForm = FormContacto()
>>> 
>>> print(miForm)
<tr><th><label for="id_asunto">Asunto:</label></th><td><input type="text" name="asunto" required id="id_asunto"></td></tr>
<tr><th><label for="id_email">Email:</label></th><td><input type="email" name="email" required id="id_email"></td></tr>
<tr><th><label for="id_msj">Msj:</label></th><td><input type="text" name="msj" required id="id_msj"></td></tr>
>>> 

El formulario esta formateado como tabla.
Crea las etiquetas 'label', les da un nombre.
Crea los asuntos e inputs.
Por defecto estos son requeridos.

Cambiando el formato del formulario

ej. como parrafo

>>> print(miForm.as_p())
<p><label for="id_asunto">Asunto:</label> <input type="text" name="asunto" required id="id_asunto"></p>
<p><label for="id_email">Email:</label> <input type="email" name="email" required id="id_email"></p>
<p><label for="id_msj">Msj:</label> <input type="text" name="msj" required id="id_msj"></p>
>>> 

ej. como lista (unsorted list)

>>> print(miForm.as_ul())
<li><label for="id_asunto">Asunto:</label> <input type="text" name="asunto" required id="id_asunto"></li>
<li><label for="id_email">Email:</label> <input type="email" name="email" required id="id_email"></li>
<li><label for="id_msj">Msj:</label> <input type="text" name="msj" required id="id_msj"></li>
>>> 

Probando el formulario is_valid() y cleaned_data

>>> miForm = FormContacto({'asunto':'prueba', 'email':'test@mail.com', 'msj':'mensaje de prueba'})
>>> 
>>> miForm.is_valid()
True
>>> 
>>> miForm.cleaned_data
{'asunto': 'prueba', 'email': 'test@mail.com', 'msj': 'mensaje de prueba'}
>>> 

Campo email invalido

>>> miForm = FormContacto({'asunto':'prueba', 'email':'test@mailcom', 'msj':'mensaje de prueba'})
>>> 
>>> miForm.is_valid()
False
>>> 
>>> miForm.cleaned_data
{'asunto': 'prueba', 'msj': 'mensaje de prueba'}
>>> 

Cambiando views.py para usar el Api Forms

...
from gestionPedidos.forms import FormContacto

...
def contacto(request):
    if request.method == "POST":
        miForm = FormContacto(request.POST)
        if miForm.is_valid():
            contenido = miForm.cleaned_data
            
            send_mail(contenido['asunto'], contenido['msj'],
            contenido.get('email',''),['webmasterd@test.com'],)
            
            return render(request, 'gracias.html')
    else:
        miForm = FormContacto()
    
    return render(request, 'form_contacto.html', {"form":miForm})

templates/form_contacto.html

...
    <body>
        <h1>Formulario de contacto</h1>
        {% if forms.errors %}
            <p style="color:red;"> Por favor revisa este campo</p>
        {% endif %}
        <form action="" method="POST">{% csrf_token %}
            <table>
                {{ form.as_table}}
            </table>
            <input type="submit" value="Enviar">
        </form>
    </body>
...

Ir a: Repositorio, Envio de Mails,
Proyecto Web Completo