Django - Traitement de formulaire

Créer des formulaires dans Django est vraiment similaire à la création d'un modèle. Là encore, il suffit d'hériter de la classe Django et les attributs de la classe seront les champs du formulaire. Ajoutons unforms.pyfichier dans le dossier myapp pour contenir nos formulaires d'application. Nous allons créer un formulaire de connexion.

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())

Comme vu ci-dessus, le type de champ peut prendre l'argument "widget" pour le rendu html; dans notre cas, nous voulons que le mot de passe soit masqué et non affiché. De nombreux autres widgets sont présents dans Django:DateInput pour les dates, CheckboxInput pour les cases à cocher, etc.

Utilisation du formulaire dans une vue

Il existe deux types de requêtes HTTP, GET et POST. Dans Django, l'objet de requête passé en paramètre à votre vue a un attribut appelé «méthode» où le type de requête est défini, et toutes les données passées via POST sont accessibles via le dictionnaire request.POST.

Créons une vue de connexion dans notre 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 vue affichera le résultat du formulaire de connexion publié via le loggedin.html. Pour le tester, nous aurons d'abord besoin du modèle de formulaire de connexion. Appelons cela 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>

Le modèle affichera un formulaire de connexion et affichera le résultat dans notre vue de connexion ci-dessus. Vous avez probablement remarqué la balise dans le modèle, qui sert uniquement à empêcher les attaques de falsification de requêtes intersites (CSRF) sur votre site.

{% csrf_token %}

Une fois que nous avons le modèle de connexion, nous avons besoin du modèle connecté.html qui sera rendu après le traitement du formulaire.

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

Maintenant, nous avons juste besoin de notre paire d'URL pour commencer: 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'))

Lors de l'accès à "/ myapp / connection", nous obtiendrons le modèle login.html suivant rendu -

Sur la publication du formulaire, le formulaire est valide. Dans notre cas, assurez-vous de remplir les deux champs et vous obtiendrez -

Si votre nom d'utilisateur est polo et que vous avez oublié le mot de passe. Vous obtiendrez le message suivant -

Utilisation de notre propre validation de formulaire

Dans l'exemple ci-dessus, lors de la validation du formulaire -

MyLoginForm.is_valid()

Nous n'avons utilisé que le moteur de validation d'auto-formulaire Django, dans notre cas, nous nous assurons simplement que les champs sont obligatoires. Essayons maintenant de nous assurer que l'utilisateur essayant de se connecter est présent dans notre base de données en tant qu'entrée Dreamreal. Pour cela, changez myapp / forms.py en -

#-*- 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

Maintenant, après avoir appelé la méthode "is_valid", nous obtiendrons la sortie correcte, uniquement si l'utilisateur est dans notre base de données. Si vous souhaitez vérifier un champ de votre formulaire, ajoutez simplement une méthode commençant par "clean_" puis votre nom de champ à votre classe de formulaire. Élever un formulaire.ValidationError est important.