Django - Procesamiento de formularios

Crear formularios en Django es realmente similar a crear un modelo. Aquí nuevamente, solo necesitamos heredar de la clase Django y los atributos de la clase serán los campos del formulario. Agreguemos unforms.pyarchivo en la carpeta myapp para contener nuestros formularios de aplicación. Crearemos un formulario de inicio de sesión.

myapp/forms.py

#-*- coding: utf-8 -*-
from django import forms

class LoginForm(forms.Form):
   user = forms.CharField(max_length = 100)
   password = forms.CharField(widget = forms.PasswordInput())

Como se vio anteriormente, el tipo de campo puede tomar el argumento "widget" para la representación html; en nuestro caso, queremos que la contraseña esté oculta, no mostrada. Muchos otros widgets están presentes en Django:DateInput para las fechas, CheckboxInput para casillas de verificación, etc.

Usar formulario en una vista

Hay dos tipos de solicitudes HTTP, GET y POST. En Django, el objeto de solicitud que se pasa como parámetro a su vista tiene un atributo llamado "método" donde se establece el tipo de solicitud y se puede acceder a todos los datos pasados ​​a través de POST a través del diccionario request.POST.

Creemos una vista de inicio de sesión en nuestro myapp / views.py -

#-*- coding: utf-8 -*-
from myapp.forms import LoginForm

def login(request):
   username = "not logged in"
   
   if request.method == "POST":
      #Get the posted form
      MyLoginForm = LoginForm(request.POST)
      
      if MyLoginForm.is_valid():
         username = MyLoginForm.cleaned_data['username']
   else:
      MyLoginForm = Loginform()
		
   return render(request, 'loggedin.html', {"username" : username})

La vista mostrará el resultado del formulario de inicio de sesión publicado a través del loggedin.html. Para probarlo, primero necesitaremos la plantilla del formulario de inicio de sesión. Llamémoslo login.html.

<html>
   <body>
      
      <form name = "form" action = "{% url "myapp.views.login" %}" 
         method = "POST" >{% csrf_token %}
         
         <div style = "max-width:470px;">
            <center> 
               <input type = "text" style = "margin-left:20%;" 
                  placeholder = "Identifiant" name = "username" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center>
               <input type = "password" style = "margin-left:20%;" 
                  placeholder = "password" name = "password" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center> 
            
               <button style = "border:0px; background-color:#4285F4; margin-top:8%;
                  height:35px; width:80%;margin-left:19%;" type = "submit" 
                  value = "Login" >
                  <strong>Login</strong>
               </button>
               
            </center>
         </div>
         
      </form>
      
   </body>
</html>

La plantilla mostrará un formulario de inicio de sesión y publicará el resultado en nuestra vista de inicio de sesión anterior. Probablemente haya notado la etiqueta en la plantilla, que es solo para evitar el ataque de falsificación de solicitudes entre sitios (CSRF) en su sitio.

{% csrf_token %}

Una vez que tenemos la plantilla de inicio de sesión, necesitamos la plantilla login.html que se procesará después del tratamiento del formulario.

<html>
   
   <body>
      You are : <strong>{{username}}</strong>
   </body>
   
</html>

Ahora, solo necesitamos nuestro par de URL para comenzar: myapp / urls.py

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('myapp.views',
   url(r'^connection/',TemplateView.as_view(template_name = 'login.html')),
   url(r'^login/', 'login', name = 'login'))

Al acceder a "/ myapp / connection", obtendremos la siguiente plantilla login.html renderizada:

En la publicación del formulario, el formulario es válido. En nuestro caso, asegúrese de completar los dos campos y obtendrá:

En caso de que su nombre de usuario sea polo y haya olvidado la contraseña. Recibirá el siguiente mensaje:

Usando nuestra propia validación de formularios

En el ejemplo anterior, al validar el formulario:

MyLoginForm.is_valid()

Solo usamos el motor de validación de auto-formulario de Django, en nuestro caso solo nos aseguramos de que los campos sean obligatorios. Ahora intentemos asegurarnos de que el usuario que intenta iniciar sesión esté presente en nuestra base de datos como entrada de Dreamreal. Para esto, cambie myapp / forms.py a -

#-*- coding: utf-8 -*-
from django import forms
from myapp.models import Dreamreal

class LoginForm(forms.Form):
   user = forms.CharField(max_length = 100)
   password = forms.CharField(widget = forms.PasswordInput())

   def clean_message(self):
      username = self.cleaned_data.get("username")
      dbuser = Dreamreal.objects.filter(name = username)
      
      if not dbuser:
         raise forms.ValidationError("User does not exist in our db!")
      return username

Ahora, después de llamar al método "is_valid", obtendremos la salida correcta, solo si el usuario está en nuestra base de datos. Si desea verificar un campo de su formulario, simplemente agregue un método comenzando por "clean_" y luego su nombre de campo a su clase de formulario. Levantando formularios.ValidationError es importante.