15 Mart 2014 Cumartesi

Django'da Formlar - I

Merhaba Arkadaşlar,

Bu hafta sizlere Django'da formları anlatacağım. Etkileşimli web sayfaları hazırlamanın yolu FORM kullanmaktan geçer. Web'in en kullanışlı niteliği ve belki de internet üzerindeki öteki servislere göre daha yaygın olmasının nedeni formlardır. Örneğin: e-bankacılık, e-sigortacılık, e-ticaret, e-eğitim,... gibi etkileşimli her işte form kullanılır. Formlar, kullanıcıdan veri (bilgi) almak için düzenlenir. 


Ayrıca formlar web geliştiricileri için en sıkıcı elemanlardır. Oldukça basit bir mantığı olmasına karşın sürekli aynı işlerin yapılması programcıları bıktırır. Eğer Django kullanmıyorsanız kullanıcıdan gelen verinin denetimi, uygun veri gelmediğinde tekrar kullanıcıya (bir önceki gönderisi ile doldurulmuş) formu göstermek gibi bir takım benzer ve sıkıcı işler sizi bekliyor demektir. Django web formlarının otomatik olarak üretilmesini sağladığından böyle sıkıcı işlerle uğraşmanıza gerek kalmaz. 

Öncelikle işleyişin nasıl olduğunu anlamak için GET ve POST yöntemleri arasındaki farkı ve standart HTML formlarını inceleyelim.



GET ve POST

Kullanıcı veriyi size iki yöntemle gönderebilir: GET ve POST. İki yöntemle de kullanıcıdan veri almak mümkün. Ancak aralarında belli başlı farklar var. Örneğin GET ile veri alırsanız tüm veri tarayıcının adres çubuğunda görünür ve boyutu yaklaşık olarak 2KB civarıdır.
POST ise form verilerini tarayıcıya doğrudan gönderdiğinden adres satırında görünmez ve boyutu istediğiniz kadar olabilir. Böyle baktığımızda her zaman POST kullanmak daha akıllıca görünüyor olabilir ama GET yönteminden vazgeçemeyeceğimiz durumlar da vardır. "Ne zaman hangi yöntemi kullanmalıyım?" sorusunu duyar gibi oluyorum. Basitçe şöyle karar verebilirsiniz : eğer kullanıcıdan gelecek veri üzerinde herhangi bir işlem yapacaksanız ve gelen veriyi sunucuda herhangi bir şekilde saklayacaksanız POST yöntemini, aksi halde GET yöntemini kullanabilirsiniz. Şimdi GET yöntemi ile küçük bir örnek yapalım. Geçen haftalarda yaptığımız okul projemizin okul/urls.py dosyasının urlpatterns değişkenine aşağıdaki satırı ekleyelim:

url(r'^get-deneme/', yonetim.views.get_deneme),

Aşağıdaki görünümü yonetim/views.py dosyasına ekleyelim:

from django.http import *

def get_deneme(request):
    if request.method == 'GET':
        adi = request.GET['adi']
        soyadi = request.GET['soyadi'] 
        return HttpResponse(u'<b>Adi : </b> %s <br><b> Soyadi : </b> %s' % (adi,soyadi))


Görünümden de anlayacağınız üzere veri GET ile gönderilmiş ise form elemanlarından adi ve soyadi girdilerindeki veri request.GET['adi'] ve request.GET['soyadi'] ile alınıp kullanıcıya görüntüleniyor. Burada eğer girdilerden biri girilmemiş ise hata yükselir. Eğer request.GET.get('adi') şeklinde de alabiliriz. Bu durumda veri girilmiş ise alınır girilmemiş ise boş gösterilir. Şİmdi de tarayıcımızdan aşağıdaki adresi isteyelim: (Tarayıcıdan adres girmeden önce sunucumuzun çalışıyor durumda olduğundan emin olalım. Buradan sunucu nasıl başlatılır bakabilirsiniz.)

http://localhost:8000/get-deneme/?adi=Ahmet&soyadi=G%C3%9CNAY

Ekran görüntümüz şekildeki gibi olucaktır : 
GET ile veri aktarımı



Gördüğünüz gibi adres satırındaki metin Django tarafından irdelenip kullanıcıya sunuldu.






FORMLAR

Formların nasıl çalıştığını öğrenmek için öğretim elemanı ekleme işlemini gerçekleştirmek üzere aşağıdaki formu (şablon olarak ) hazırlayalım: 

yonetim/sablonlar/ogretim_elemani_formu.html 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
<head>
<title> Ogretim Elemani Ekleme </title>
</head>

    <link rel="stylesheet" type="text/css" href="/static/django_kitabi.css"/>

<body>
<h1>  Ogretim Elemani Ekleme  Formu </h1>

{% if hatalar %}
Aşağıdaki hatalı düzeltin ve yeniden gönderin
<font color ="red" >
{{ hatalar|unordered_list }}
</font>
{% endif %}


<form method ="POST" action ="/ogretim-elemani-ekleme">
{% csrf_token %}

<table border = "1">
<tr><th>Adi :</th>    <td><input type ="text" name= "adi" value="{{adi}}"></td></tr>
<tr><th>Soyadi : </th>    <td><input type ="text" name= "soyadi"  value="{{soyadi}}"></td></tr>
<tr><th>Telefonu : </th>    <td><input type ="text" name= "telefonu" value="{{telefonu}}"></td></tr>
<tr><th>E-Posta Adresi : </th>    <td><input type ="text" name= "e_posta_adresi" value="{{e_posta_adresi}}"></td></tr>
</table>

<input type="submit" value="Gonder">
</form>
</body>
</html>

Bu formda dikkat etmişseniz csrf_token bağlam değişkenini görüyorsunuz.Bu değişken  Cross Site Request Forgery saldırılarından korunmak için form içerisinde her oturum için rastgele değer üretilip bu değerin kullanıcıdan geleni ile sunucudaki karşılaştırıldıktan sonra işlemin yapılmasını sağlar. Buradaki değer her oturum için farklıdır. 

Şimdi de aşağıdaki görünümü ekleyelim: 


yonetim/views.py 
from django.http import *
from django.template import RequestContext

def ogretim_elemani_ekleme(request):
    
    if request.method =="POST":
        adi = request.POST.get('adi')
        soyadi = request.POST.get('soyadi') 
        telefonu = request.POST.get('telefonu')
        e_posta_adresi = request.POST.get('e_posta_adresi')

        hatalar = []

        if not (adi and soyadi):
            hatalar.append(u'Adi veya soyadi eksik. Bu alanlar gereklidir.')
            
        if e_posta_adresi:
            if not '@' in e_posta_adresi:
                hatalar.append(u'E-posta adresi yanlış.')

                
        if not hatalar:
            ogrelm = OgretimElemani(adi=adi,
                                    soyadi=soyadi,
                                    telefonu=telefonu,
                                    e_posta_adresi = e_posta_adresi
                                    )
            ogrelm.save()
            return HttpResponse(u''' <h2> Aşağıdaki öğretim elamanı eklendi</h2>
                <br><b>Adı :</b> %s
                <br><b>Soyadı :</b> %s
                <br><b>Telefonu:</b> %s
                <br><b>E-posta Adresi:</b> %s ''' % (adi,soyadi,telefonu,e_posta_adresi))
            
 
    return render_to_response('ogretim_elemani_formu.html' ,locals(), context_instance = RequestContext(request))



Görünümümüzü incelediğimizde öğretim elemanı ekleyebilmek için ad ve soyad alanlarını doldurulması zorunlu alanlar yaptık. Ayrıca eklenen e-posta adresinin geçerli bir e-posta olup olmadığına da sadece @ karakterinin olup olmadığına baktık. Ayrıca form eksikse tarayıcının Geri butonuna tıkladığımızda yani geri geldiğimde girdiğim verileri karşımda görmek isteyeceğim için görünümdeki aşağıdaki satırı ekledim:

return render_to_response('ogretim_elemani_formu.html' ,locals(), context_instance = RequestContext(request))


Şimdi de yukardaki görünüme adres atayalım. Yani okul/urls.py dosyasında urlpatterns değişkenine aşağıdaki satırı ekleyelim:

 url(r'^ogretim-elemani-ekleme', yonetim.views.ogretim_elemani_ekleme),

Eksik ve yanlış girilmiş form














Verileri doğru girilmiş form

Gönder Butonuna basıldıktan sonra
































Bu haftalık bu kadar arkadaşlar. Önümüzdeki hafta Django formlarına bakacağız. Aslında bu kadar uğraşmaya gerek olmadığını hep birlikte göreceğiz. "Neden bunca iş yaptık?" diye sorduğunuzu duyar gibiyim. Evet haklısınız ama en azından artık formların nasıl çalıştığını biliyoruz. Djangonun formlarının ne kadar basit ve kullanışlı olduğunu önümüzdeki hafta görünce siz de seveceksiniz. Teşekkürler :)

Referanslar :
  1. https://docs.djangoproject.com/en/dev/
  2. BAŞER, Mustafa (2013). Django
  3. http://tr.wikipedia.org/
  4. http://www.baskent.edu.tr/~tkaracay/etudio/ders/internet/html/forms/form/form_01.html

Hiç yorum yok:

Yorum Gönder