Hola de nuevo, aquí estamos con la tercera y última parte de nuestro pequeño "howto" ejemplo de Django. Si no entendeis algo, es normal si no habeis consultado el manual de Django previamente. Se necesita una base de Django para entender el artículo. Me habría gustado encontrar algo así cuando comencé mis andanzas con Django, por eso lo escribí. El manual de Django lo podeis consultar aqui: https://docs.djangoproject.com/en/1.5/ Hay hasta un .pdf que podeis descargar para más fácil consulta.

Bueno, tras éste preámbulo, vamos a pasar a lo que nos ocupa.

def contacto(request):
    email_ok=False
    error=consulta=empresa=contacto=""
    frm=FormCliente()
    if request.method=="POST":
        frm=FormCliente(request.POST)
        if frm.is_valid():
            empresa=frm.cleaned_data[''empresa'']
            contacto=frm.cleaned_data[''contacto'']
            direccion=frm.cleaned_data[''direccion'']
            localidad=frm.cleaned_data[''localidad'']
            pais=frm.cleaned_data[''pais'']
            email=frm.cleaned_data[''email'']
            telefono=frm.cleaned_data[''telefono'']
            consulta=frm.cleaned_data[''consulta'']
            message="%s (%s)\\nEn %s (%s, %s)\\n\\nConsulta: %s\\n\\n (%s)%s\\n\\n" 
            message=message % (empresa, email, direccion, localidad, pais, 
                               consulta, contacto, telefono)
            try:
                #send_mail("%s solicita informacion" % empresa, message, email, [''[email protected]''])
            except BadHeaderError:
                error=''Error en la cabecera del mensaje.''
            email_ok=True
        else:
            error="Datos incorrectos, revise y reintente."
    return render(request, "contacto.html", {''form'':frm, 
                                             ''ok'':email_ok, "error":error, 
                                             "consulta":consulta, 						     "contacto":contacto, 
                                             "empresa":empresa})

La función quienes es trivial, por lo cual no la explico. En cuanto a la funcion contacto podemos ver que para empezar, inicializamos unas cuantas variables. Posteriormente, instanciamos el formulario FormCliente, el cual contiene la definición de los campos de entrada correspondientes a Cliente (model.py). En el primer if, comprobamos que el tipo de petición es POST. Si es así, reinstanciamos el formulario FormCliente, pero ésta vez le pasamos los datos de la petición POST para después verificar mediante .is_valid() la corrección de las restricciones que aplicamos en FormCliente. Como veis, si es todo correcto, extraemos del formulario los datos pertinentes, generamos el mensaje que enviaremos por email con la funcion send_mail. En éste caso comprobamos la cabecera del mensaje como medida de seguridad. Podeis ver que usamos algunas variables auxiliares como email_ok o error, que en las templates utilizaremos para mostrar un texto u otro diferente. El formato de render contiene 3 parámetros en éste caso: request (datos sobre la peticion, datos de sesion, cookies, etc..), "contacto.html" es el nombre del archivo dentro de /templates/ que Django enviará al navegador para su renderizado. Esta cadena permite añadir rutas relativas a /templates/. Un ejemplo sería "otrapp/page1.html". En éste caso la ruta [..]/templates/otraapp/ deberia existir conteniendo el archivo page1.html.

Como muestra de template, vamos a ver la de contacto.html.

<main.html> <!DOCTYPE html> <html> <head> <title>Web Empresarial|{% block title %}{% endblock %}</title> <link rel="stylesheet" href="/st/css/style.css" /> <link rel="stylesheet" href="/st/css/menu.css" /> {% block css %} {% endblock %} {% block js %} {% endblock %} </head> <body> <header> <img src="http://dummyimage.com/240x120"/> {% block header %} {% endblock %} </header> <nav> {% block menu %} <div id=''cssmenu''> <ul> <li><a href=''/servicios''><span>Servicios</span></a></li> <li><a href=''/productos''><span>Productos</span></a></li> <li><a href=''/quienes-somos''><span>Quienes somos</span></a></li> <li class=''last''><a href=''/contacto''><span>Contacto</span></a></li> </ul> </div> {% endblock %} </nav> <section> {% block section %} {% endblock %} </section> <footer> {% block footer %} {% endblock %} </footer> </body> </html> <contacto.html> {% extends "main.html" %} {% block title %}Contactar{% endblock %} {% block header %} <h2>Contacto</h2> {% endblock %} {% block menu %} <div id=''cssmenu''> <ul> <li><a href=''/servicios''><span>Servicios</span></a></li> <li><a href=''/productos''><span>Productos</span></a></li> <li><a href=''/quienes-somos''><span>Quienes somos</span></a></li> <li class=''last active''><a href=''/contacto''><span>Contacto</span></a></li> </ul> </div> {% endblock %} {% block section %} <div id="contact"> {% if ok %} {{ contacto }}, Lorem ipsum dolor sit amet {% else %} <h4>Lorem ipsum dolor sit amet</h4> <form name="frmcontact" id="frmcontact" action="/contacto/" method="post">{% csrf_token %} <table border="0"> {{ form.as_table }} <tr><th></th><td>{{ error }}</td></tr> </table> <button type="submit" id="btnsend" class="cbutton">Enviar Solicitud</button> </form> {% endif %} </div> {% endblock %} {% block footer %} {% endblock %}

El archivo contacto.html comienza con {% extends "main.html" %}. Las {% %} indican un comando de template. En éste caso es extends "main.html". main.html contiene una definición de archivo html con blocks (bloques) definidos, que se reemplazarán en el archivo que extiende el archivo principal (contacto.html), mediante redefiniciones de dichos bloques. Por ejemplo el block title, situará la palabra contactar en el título (ver el tag title de main.html).

Tras algunas redefiniciones nos encontramos con {{ contacto }} dentro de un {% if ok %}{% endif %}. contacto es una variable que queremos mostrar y ok está en la parte de la condición del if, en éste caso si se evalúa a True, se ejecuta y muestra la parte interna del if. Caso contrario, se ejecuta el else. csrf_token implementa una medida de seguridad que se utiliza por defecto en los formularios Django y form.as_table muestra dentro de una tabla el formulario definido en la variable form que pasamos desde la funcion contacto. El resto está definido como un formulario normal de tipo POST, sin ajax de ningun tipo. Se podría implementar con ajax también pero para el ejemplo considero la simpleza algo importante.

En las templates existen varias funcionalidades más como por ejemplo la implementación de filtros, que hacen muy potente el sistema de templates de Django.

En cuanto al formulario del que hablamos antes, decir que se explica por si mismo. En éste caso, es una clase que extiende a forms.Form (formulario base) al que añadimos varias propiedades de tipo caracter o email, con campos requeridos y longitudes diversas. Existen muchos más parámetros que podemos pasar a las diferentes clases que integran los tipos de datos en django.forms. Os remito al manual para que sigais investigando sobre éstos tipos de datos o cualquier ampliación del tema. El manual es claro y extenso, muy completo e imprescindible seguirlo de principio a fin.

from django import forms

class FormCliente(forms.Form):
    empresa=forms.CharField(required=True,max_length=45)
    contacto=forms.CharField(required=True,max_length=65)
    direccion=forms.CharField(required=True,max_length=220)
    localidad=forms.CharField(required=True,max_length=55)
    pais=forms.CharField(required=True,max_length=55)
    telefono=forms.CharField(required=True,max_length=19)
    email=forms.EmailField(required=True,max_length=45)
    consulta=forms.CharField(required=True,max_length=690)

Nada más por hoy. Finalizamos así la serie de 3 artículos sobre Django. Si teneis dudas o consultas, no dudeis en dejar un mensaje debajo.

Para ver como quedará nuestra página, podeis acceder a ésta url http://djangoweb.tuxrincon.com. El código está aquí empresa.zip

Gracias por la lectura y os deseo una feliz andadura con éste framework. Saludos.

Currently unrated
  • Share

Comments

There are currently no comments

New Comment

* Please fill all required form field, thanks!