12 Mayıs 2014 Pazartesi

Form Kümeleri

Bir sayfada birden çok form ile çalışmaya form kümeleri(formsets) denir. Yani bir sayfada birden çok form ile çalışmak için form kümelerini kullanacağız. forms.py dosyası içerisindeki HastaFormu'nu şu şekilde düzenliyoruz.
class HastaFormu(forms.Form):
 adi = forms.CharField()
 soyadi = forms.CharField()
Form kümeleri sayesinde bir sayfada birden fazla Doktor veya Hasta ekleme olanağımız olacak. Şimdi komut satırına geçiyoruz.
>>> from yonetim.forms import *
>>> from django.forms.formsets import formset_factory
>>> HastaFormKumesi = formset_factory(HastaFormu)
>>> formkumesi = HastaFormKumesi()
Form kümesini oluşturmuş olduk. Şimdi ekrana bastıralım.
>>> print formkumesi

<input id="id_form-TOTAL_FORMS" name="form-TOTAL_FORMS" type="hidden" value="1" /><input id="id_form-INITIAL_FORMS" name="form-INITIAL_FORMS" type="hidden" value="0" /><input id="id_form-MAX_NUM_FORMS" name="form-MAX_NUM_FORMS" type="hidden" value="1000" />
<tr><th><label for="id_form-0-adi">Adi:</label></th><td><input id="id_form-0-adi" name="form-0-adi" type="text" /></td></tr>
<tr><th><label for="id_form-0-soyadi">Soyadi:</label></th><td><input id="id_form-0-soyadi" name="form-0-soyadi" type="text" /></td></tr>
Form kümesi burada bir adet form barındırmaktadır.
Form Kümelerinin Başlangıç Değerleri
Form kümelerine başlangıç değerleri verebiliriz. Form kümelerine başlangıç değeri verebilmek için her forma bir sözlük hazırlayıp bu sözlükleri bir listeye ekleyip initial parametresine bu listeyi vermemiz gerekiyor.
>>> HastaFormKumesi = formset_factory(HastaFormu,extra=2)
>>> hasta1 = {'adi':'Mustafa','soyadi':'Yılmaz'}
>>> hasta2 = {'adi':'Tahsin','soyadi':'Ufuk'}
>>> formkumesi = HastaFormKumesi(initial=[hasta1,hasta2])
Burada kullandığımız extra parametresi varsayılan değeri belirtilmiş formlardan ayrı olarak kaç adet boş form geleceğini belirtiyor. extra parametresinin varsayılan değeri 1'dir.
>>>> print formkumesi
<input id="id_form-TOTAL_FORMS" name="form-TOTAL_FORMS" type="hidden" value="4" /><input id="id_form-INITIAL_FORMS" name="form-INITIAL_FORMS" type="hidden" value="2" />
<input id="id_form-MAX_NUM_FORMS" name="form-MAX_NUM_FORMS" type="hidden" value="1000" />
<tr><th><label for="id_form-0-adi">Adi:</label></th><td><input id="id_form-0-adi" name="form-0-adi" type="text" value="Mustafa" /></td></tr>
<tr><th><label for="id_form-0-soyadi">Soyadi:</label></th><td><input id="id_form-0-soyadi" name="form-0-soyadi" type="text" value="Yılmaz" /></td></tr>
<tr><th><label for="id_form-1-adi">Adi:</label></th><td><input id="id_form-1-adi" name="form-1-adi" type="text" value="Tahsin" /></td></tr>
<tr><th><label for="id_form-1-soyadi">Soyadi:</label></th><td><input id="id_form-1-soyadi" name="form-1-soyadi" type="text" value="Ufuk" /></td></tr>
<tr><th><label for="id_form-2-adi">Adi:</label></th><td><input id="id_form-2-adi" name="form-2-adi" type="text" /></td></tr>
<tr><th><label for="id_form-2-soyadi">Soyadi:</label></th><td><input id="id_form-2-soyadi" name="form-2-soyadi" type="text" /></td></tr>
<tr><th><label for="id_form-3-adi">Adi:</label></th><td><input id="id_form-3-adi" name="form-3-adi" type="text" /></td></tr>
<tr><th><label for="id_form-3-soyadi">Soyadi:</label></th><td><input id="id_form-3-soyadi" name="form-3-soyadi" type="text" /></td></tr>
Form Yönetim Değerleri
Tarayıcıdan Django'ya bir form kümesi gönderildiğinde bu form kümesinde kaç adet form olduğu(form-TOTAL_FORMS) ve kaç tanesinin başlangıç değerlerinin olduğu(form-INITIAL_FORMS) belirtilmelidir. Django bunu kendisi halleder. Yukarıdaki çıktıya dikkat ederseniz, ilk elemanlar bu bahsettiklerimizdir. Özelliklerinde gizli olduklarını görebilirsiniz. Eğer isterseniz sadece bu elemanları da görebilirsiniz.
>>> print formkumesi.management_form
<input id="id_form-TOTAL_FORMS" name="form-TOTAL_FORMS" type="hidden" value="4" />
<input id="id_form-INITIAL_FORMS" name="form-INITIAL_FORMS" type="hidden" value="2" />
<input id="id_form-MAX_NUM_FORMS" name="form-MAX_NUM_FORMS" type="hidden" value="1000" />
Form Kümelerinin Denetimi
Form kümelerinin denetiminin form denetiminden farkı yoktur. Burada veri gönderirken form-TOTAL_FORMS, form-INITIAL_FORMS, form-MAX_NUM_FORMS değerlerini de göndermeliyiz.
>>> veri = {
... 'form-TOTAL_FORMS':'1',
... 'form-INITIAL_FORMS':'0',
... 'form-MAX_NUM_FORMS':'',
... 'form-0-adi':'Cuney',
... 'form-0-soyadi':'Gudek',
... }
>>> formkumesi = HastaFormKumesi(veri)
>>> formkumesi.is_valid()
True
Hatalı bir veri gönderelim.
>>> veri = {
... 'form-0-adi':'Tolga',
... 'form-0-soyadi':'Sahin'
... }
>>> formkumesi = HastaFormKumesi(veri)
>>> formkumesi.is_valid()
Traceback (most recent call last):
Form kumesindeki hataları errors özelliği ile görebiliriz.
>>> formkumesi.errors
Modellerden Form Kümesi Oluşturmak
Az önce yaptıklarımızda ufak değişiklikler yapacağız. Bu sefer Doktor Modelini kullanarak form kümesi oluşturalım.
>>> from django.forms.models import modelformset_factory
>>> from yonetim.models import *
>>> DoktorFormuKumesi = modelformset_factory(Doktor)
>>> formkumesi=DoktorFormuKumesi()
<input id="id_form-TOTAL_FORMS" name="form-TOTAL_FORMS" type="hidden" value="11" />
<input id="id_form-INITIAL_FORMS" name="form-INITIAL_FORMS" type="hidden" value="10" />
<input id="id_form-MAX_NUM_FORMS" name="form-MAX_NUM_FORMS" type="hidden" value="1000" />
<tr><th><label for="id_form-0-adi">Adınız:</label></th><td><input id="id_form-0-adi" maxlength="50" name="form-0-adi" type="text" value="Ali" /></td></tr>
<tr><th><label for="id_form-0-soyadi">Soyadınız:</label></th><td><input id="id_form-0-soyadi" maxlength="50" name="form-0-soyadi" type="text" value="hikmet" /></td></tr>
<tr><th><label for="id_form-0-yas">Yaşınız:</label></th><td><input id="id_form-0-yas" name="form-0-yas" type="number" /></td></tr>
<tr><th><label for="id_form-0-telefon">Telefon Numaranız:</label></th><td><input id="id_form-0-telefon" maxlength="50" name="form-0-telefon" type="text" /></td></tr>
<tr><th><label for="id_form-0-eposta">E-Posta Adresiniz:</label></th><td>
 <input id="id_form-0-eposta" maxlength="75" name="form-0-eposta" type="email" value="ali@mail.com" />
 <input id="id_form-0-id" name="form-0-id" type="hidden" value="3" /></td></tr>
<tr><th><label for="id_form-1-adi">Adınız:</label></th><td><input id="id_form-1-adi" maxlength="50" name="form-1-adi" type="text" value="Okan" /></td></tr>
<tr><th><label for="id_form-1-soyadi">Soyadınız:</label></th><td><input id="id_form-1-soyadi" maxlength="50" name="form-1-soyadi" type="text" value="Vurdu" /></td></tr>
<tr><th><label for="id_form-1-yas">Yaşınız:</label></th><td><input id="id_form-1-yas" name="form-1-yas" type="number" value="35" /></td></tr>
<tr><th><label for="id_form-1-telefon">Telefon Numaranız:</label></th><td><input id="id_form-1-telefon" maxlength="50" name="form-1-telefon" type="text" /></td></tr>
<tr><th><label for="id_form-1-eposta">E-Posta Adresiniz:</label></th><td><input id="id_form-1-eposta" maxlength="75" name="form-1-eposta" type="email" value="o@vurdu.com" />
Form Kümelerinin Görünümler ile Kullanılması
Çoklu doktor ekleyebileceğimiz bir form uygulaması yapalım. urls.py dosyasına şu kodu ekliyoruz.
url(r'^coklu-doktor-ekle',yonetim.views.coklu_doktor_ekle),
yonetim/views.py dosyasına görünümü ekliyoruz.
from django.forms.models import modelformset_factory
def coklu_doktor_ekle(request):
 DoktorFormuKumesi = modelformset_factory(Doktor,can_delete=True,extra=2)
 if request.method == "POST":
  formkumesi = DoktorFormuKumesi(request.POST)
  if formkumesi.is_valid():
   formkumesi.save()
   return HttpResponseRedirect('/coklu-doktor-ekle/')
 else:
  formkumesi = DoktorFormuKumesi()

 return render_to_response('coklu_doktor.html',locals(),context_instance=RequestContext(request))
Doktor modelinden form kümesi oluşturduk. Burada kullandığımız can_delete parametresi her doktor için işaret kutusu koyacaktır. extra parametresi ile 2 adet boş ekleme formu gelmesini sağladık.
coklu_doktor.html
<!DOCTYPE html>
<html>
<head>
    <title>Çoklu Doktor Ekleme</title>
    <link rel="stylesheet" type="text/css" href="/dosyalar/base.css" />
</head>
<body>
<form method="POST">
   {% csrf_token %}
    {{formkumesi.management_form}}
    {% for form in formkumesi %}
        <table border="1">
            {{ form }}
        </table>
    {% endfor %}
<input type="submit" value="Gönder">
</form>

</body>
</html>
Gördüğünüz gibi veritabanımızda olan tüm doktorları ve altında da 2 adet yeni doktor ekleme formu getirdi.

Kaynakça
  • Mustafa Başer Django Kitabı

1 yorum :

  1. Mükemmel Tek kelimeyle size minnettarım yazıların devamını dört gözle bekliyorum

    YanıtlaSil