Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PYTHON
En este punto es mucho más fácil conseguir que Django haga la mayor parte de
este trabajo por nosotros.
La plantilla
No necesitamos hacer mucho en nuestra plantilla:name.html
Eso es todo lo que necesita para empezar, pero el marco de formularios pone
mucho más a su alcance. Una vez que comprenda los conceptos básicos del
proceso descrito anteriormente, debe estar preparado para entender otras
características del sistema de formularios y listo para aprender un poco más sobre
la maquinaria subyacente.
Más información sobre las clases de Django Form
Todas las clases de formulario se crean como subclases de django.forms.Form o
django.forms.ModelForm. Usted puede pensar como una subclase de . y en
realidad heredan la funcionalidad común de una clase (privada), pero este detalle
de implementación rara vez es
importante.ModelFormFormFormModelFormBaseForm
Modelos y formularios
De hecho, si el formulario se va a usar para agregar o editar directamente un
modelo Django, un ModelForm puede ahorrarle mucho tiempo, esfuerzo y código,
ya que creará un formulario, junto con los campos adecuados y sus atributos, de
una clase.Model
Instancias de formulario enlazadas y sin enlazar
La distinción entre formularios enlazados y no consolidados es importante:
Un formulario sin enlazar no tiene datos asociados. Cuando se representa al
usuario, estará vacío o contendrá valores predeterminados.
Un formulario enlazado ha enviado datos y, por lo tanto, se puede usar para saber
si esos datos son válidos. Si se representa un formulario enlazado no válido,
puede incluir mensajes de error en línea que le dicen al usuario qué datos corregir.
El atributo is_bound del formulario le indicará si un formulario tiene datos
enlazados a él o no.
Más información sobre el campo
Considere una forma más útil que nuestro ejemplo mínimo anterior, que
podríamos usar para implementar la funcionalidad "contácteme" en un sitio web
personal:
forms.py
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
Nuestro formulario anterior utilizaba un solo campo, un CharField. En este caso,
nuestro formulario tiene cuatro campos: , , y . CharField, EmailField y BooleanField
son solo tres de los tipos de campo disponibles; se puede encontrar una lista
completa en los campos Formulario.your_namesubjectmessagesendercc_myself
Widgets
Cada campo de formulario tiene una clase widgetcorrespondiente, que a su vez
corresponde a un widget de formulario HTML como .<input type="text">
En la mayoría de los casos, el campo tendrá un widget predeterminado sensato.
Por ejemplo, de forma predeterminada, un CharField tendrá un widget TextInput,
que genera un en el HTML. Si lo necesitara, especificaría el widget adecuado al
definir el campo de formulario, como hemos hecho con el campo.<input
type="text"><textarea>message
Datos de campo
Independientemente de los datos enviados con un formulario, una vez que se
hayan validado correctamente mediante una llamada (y se haya devuelto), los
datos del formulario validado estarán en el diccionario. Estos datos se habrán
convertido muy bien en tipos de Python para
usted.is_valid()is_valid()Trueform.cleaned_data
nota
Todavía puede tener acceso a los datos no validados directamente desde
este punto, pero los datos validados son mejores.request.POST
views.py
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)
Sin embargo, hay otras opciones de salida para los pares / :<label><input>
{{ form.as_table }} los representará como celdas de mesa envueltas en
etiquetas<tr>
{{ form.as_p }} los hará envueltos en etiquetas<p>
{{ form.as_ul }} los hará envueltos en etiquetas<li>
Tenga en cuenta que tendrá que proporcionar los alrededores o los elementos
usted mismo.<table><ul>
Aquí está el resultado de nuestra instancia:{{ form.as_p }}ContactForm
<p><label for="id_subject">Subject:</label>
<input id="id_subject" type="text" name="subject" maxlength="100"
required></p>
<p><label for="id_message">Message:</label>
<textarea name="message" id="id_message" required></textarea></p>
<p><label for="id_sender">Sender:</label>
<input type="email" name="sender" id="id_sender" required></p>
<p><label for="id_cc_myself">Cc myself:</label>
<input type="checkbox" name="cc_myself" id="id_cc_myself"></p>
Tenga en cuenta que cada campo de formulario tiene un atributo ID establecido en
, al que hace referencia la etiqueta de etiqueta adjunta. Esto es importante para
garantizar que las formas sean accesibles para la tecnología de asistencia, como
el software de lector de pantalla. También puede personalizar la forma en que se
generan las etiquetas y los ids.id_<field-name>
Consulte Salida de formularios como HTML para obtener más información al
respecto.
Campos de renderizado manualmente
No tenemos que dejar que Django desempaquete los campos del formulario;
podemos hacerlo manualmente si nos gusta (lo que nos permite reordenar los
campos, por ejemplo). Cada campo está disponible como atributo del formulario
mediante , y en una plantilla de Django, se representará correctamente. por
ejemplo:{{ form.name_of_field }}
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.subject.errors }}
<label for="{{ form.subject.id_for_label }}">Email subject:</label>
{{ form.subject }}
</div>
<div class="fieldWrapper">
{{ form.message.errors }}
<label for="{{ form.message.id_for_label }}">Your message:</label>
{{ form.message }}
</div>
<div class="fieldWrapper">
{{ form.sender.errors }}
<label for="{{ form.sender.id_for_label }}">Your email address:</label>
{{ form.sender }}
</div>
<div class="fieldWrapper">
{{ form.cc_myself.errors }}
<label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label>
{{ form.cc_myself }}
</div>
Los elementos completos también se pueden generar utilizando el label_tag(). por
ejemplo:<label>
<div class="fieldWrapper">
{{ form.subject.errors }}
{{ form.subject.label_tag }}
{{ form.subject }}
</div>
Representación de mensajes de error de formulario
El precio de esta flexibilidad es un poco más de trabajo. Hasta ahora no hemos
tenido que preocuparnos por cómo mostrar errores de forma, porque eso se ha
cuidado de nosotros. En este ejemplo hemos tenido que asegurarnos de que nos
ocupamos de cualquier error para cada campo y cualquier error para el formulario
en su conjunto. Tenga en cuenta en la parte superior del formulario y la búsqueda
de errores de plantilla en cada campo.{{ form.non_field_errors }}
El uso muestra una lista de errores de formulario, representados como una lista
desordenada. Esto podría parecer:{{ form.name_of_field.errors }}
<ul class="errorlist">
<li>Sender is required.</li>
</ul>
La lista tiene una clase CSS de para permitirle aplicar estilo a su apariencia. Si
desea personalizar aún más la visualización de los errores, puede hacerlo en
bucle sobre ellos:errorlist
{% if form.subject.errors %}
<ol>
{% for error in form.subject.errors %}
<li><strong>{{ error|escape }}</strong></li>
{% endfor %}
</ol>
{% endif %}
Los errores que no sean de campo (y/o errores de campo ocultos que se
representan en la parte superior del formulario cuando se usan auxiliares como )
se representarán con una clase adicional de para ayudar a distinguirlos de errores
específicos del campo. Por ejemplo,
parecería:form.as_p()nonfield{{ form.non_field_errors }}
{{ field.label }}
La etiqueta del campo, por ejemplo. .Email address
{{ field.label_tag }}
La etiqueta del campo se ajusta en la etiqueta HTML adecuada. Esto incluye la
label_suffixdel formulario. Por ejemplo, el valor predeterminado es dos
puntos:<label>label_suffix
Importar a SMTP
El Protocolo simple de transferencia de correo (SMTP en inglés) maneja el envío y
el correo electrónico de enrutamiento entre los servidores de correo.
En Python, el módulo smtplib define un objeto de sesión de cliente SMTP que se
puede usar para enviar correo a cualquier máquina de Internet con un daemon de
escucha SMTP o ESMTP.
He aquí cómo crear un objeto SMTP.
import smtplib
server = smtplib.SMTP(host='host_address',port=your_port)
#create server
server = smtplib.SMTP('smtp.gmail.com: 587')
server.starttls()
# Login Credentials for sending the mail
server.login(msg['From'], password)
# send the message via the server.
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()
print "successfully sent email to %s:" % (msg['To'])
Tenga en cuenta que las direcciones 'Para' y 'De' deben incluirse explícitamente
en los encabezados de los mensajes.
Crear y enviar un correo electrónico con un archivo adjunto
En este ejemplo, vamos a enviar un correo electrónico con un archivo adjunto de
imagen. El proceso es similar al envío de un correo electrónico de texto sin
formato.
Crea un objeto SMTP para la conexión al servidor.
Ingrese a su cuenta.
Defina los encabezados de sus mensajes y las credenciales de inicio de sesión.
Cree un objeto de mensaje MIMEMultipart y adjunte los encabezados
correspondientes, es decir, desde, hasta y Asunto.
Lea y adjunte la imagen al mensaje objeto MIMEMultipart.
Finalmente, envíe el mensaje.
# create server
server = smtplib.SMTP('smtp.gmail.com: 587')
server.starttls()
# Login Credentials for sending the mail
server.login(msg['From'], password)