بخش های اصلی

آموزش Django

Django – پردازش فرم

ایجاد فرم در Django بسیار شبیه به ایجاد مدل (model) است. فقط باید از کلاسِ Django ارث بری کنیم و خصیصه‌هایِ کلاس هم همان فیلدهای فرم خواهند بود. در ادامه در فولدرِ myapp، فایلی به نامِ forms.py ایجاد می‌کنیم تا فرم‌های برنامه در آن قرار بگیرن. بعنوان مثال یک فرمِ ورود (login) ایجاد می‌کنیم.

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

همانطور که در کد بالا مشاهده می‌کنین، نوعِ فیلد می‌تواند برای رندِرِ html، آرگومانِ “widget” بگیره؛ در این مثال می‌خوایم پسورد، مخفی (hidden) باشه و نمایش داده نشه. widgetهای زیادی در Django وجود داره: DateInput برای تاریخ‌ها، CheckboxInput برای checkboxها و ... .

استفاده از فرم در view

دو نوع درخواستِ HTTP وجود داره، Get و POST. در Django، شیءِ requestای که بعنوان پارامتر، به  view پاس داده شده، خصیصه‌ای به نامِ “method” داره که نوعِ درخواست، در آن مشخص میشه و تمام داده‌هایی که با POST پاس داده شدن، از طریقِ دایرکتوریِ request.POST قابل دسترسی هستن.

در ادامه یک viewیِ login در our 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})

این view، نتیجه‌ی فرمِ loginای که از طریقِ loggedin.html، post شده را نمایش میده. برای تست کردنِ این view، نیاز به login form template داریم که نامِ آن را 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>

این Template، یک فرمِ login را نمایش میده و نتیجه را به viewیِ login بالا، post می‌کنه. احتمالاً متوجه این شدین که تگِ template، فقط برای جلوگیری از حمله‌ی "جعل درخواست بین سایتی"  (CSRF) به سایتِه.

{% csrf_token %}

حالا که login template  را داریم نیاز به oggedin.html template داریم که بعد از form treatment رِندِر میشه.

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

اکنون فقط نیاز به جفت URLهای‌مان داریم که شروع کنیم: 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'))

اگه به "/myapp/connection" برین، login.html template رندِر شده‌‌ای بصورت زیر خواهید دید :

login html template

بعد از post  کردن فرم، همان‌طور که میبینین فرم معتبرِه. در این مثال اطمینان حاصل کنین که دو فیلد را پر کرده‌این، در نتیجه خروجی بصورت زیر خواهید دید –

form validation

اگه نام کاربری‌تان polo باشه و پسورد را فراموش کرده باشین، پیام زیر را دریافت می‌کنین –

form invalid message

استفاده از اعتبارسنجی فرمِ خودمان

در مثال بالا، وقتی فرم اعتبار سنجی میشه :

MyLoginForm.is_valid()

فقط از موتور اعتبارسنجی Django self-form استفاده می‌کنیم، در این مثال اطمینان حاصل کنین که فیلدها بصورتِ required باشن. اکنون باید کاری کنیم که مطمئن بشیم،کاربری که میخواد login کنه، بعنوانِ یک کاربرِ Dreamreal در پایگاه داده وجود داشته باشه. برای انجام این‌کار، باید myapp/forms.py را بصورت زیر تغییر بدیم :

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

حالا، بعد از فراخوانیِ متدِ “is_valid” فقط درصورتی که کاربر در پایگاه داده موجود باشه، خروجی درستی دریافت می‌کنیم. اگه میخواین یکی از فیلدهای فرم را بررسی کنین، فقط متدی اضافه کنین که با “clean_” شروع شده باشه، و به دنبال آن نام فیلدِ کلاسِ فرم را اضافه کنین. ایجادِ forms.ValidationError نیز مهمِه.

در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش Django

Learn Django

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد