8 Nisan 2014 Salı

Kayıt Düzenleme ve Silme

Kayıt Düzenleme
Bir önceki konuda nasıl kayıt ekleyebileceğimizi gördük. Şimdi eklediğimiz bir kaydı nasıl düzenleyebiliriz? bunu inceleyeceğiz. Düzenleme işlemi yapabilmek için form elemanlarının varsayılan değerlerinin alanlara göre doldurulması gerekiyor. Hatırlarsanız bir form elemanın varsayılan değerini initial özelliği ile belirleye biliyorduk. Şimdi bu özelliği kullanarak doktorlar için oluşturduğumuz form ekleme formunu düzenleyelim. Eğer kullanıcı var olan bir kaydı düzenlemek isterse düzenleme, yeni kayıt eklemek isterse yeni kayıt ekleyelim.
İlk önce doktorları listelediğimiz şablonu değiştirerek form-ekle adresine gideceği butonu koyalım.
### doktor_listesi.html
<table border="1">
    <tr><th>Sıra</th><th>Adi</th><th>Soyadi</th><th>Telefon</th><th>E-Posta</th><th>İşlem</th></tr>

    {% for doktor in doktorlar %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ doktor.adi }}</td>
        <td>{{ doktor.soyadi }}</td>
        <td>{{ doktor.telefon }}</td>
        <td>{{ doktor.eposta }}</td>
        <td><a href="/doktor-ekle/?id={{ doktor.id }}">Düzenle</a></td>
    </tr>
    {% endfor %}

</table>
Adres çubuğuna http://localhost:8000/doktorlar/ yazdığımız da şu şekilde bir çıktı alacağız.
doktor_listesi.html şablonundaki 12.satıra inceleyelim. Burada GET metodunu kullanarak düzenleyeceğimiz verinin id numarasını alacağız. Veritabanından aldığımız id numarasına ait verileri getirerek formun varsayılan değeri yapacağız. Şimdi bu işlemleri yapacağımız doktor_ekleme görünümünü oluşturalım.
def doktor_ekleme(request):
 doktorID = request.GET.get('id')

 if doktorID:
  try:
   doktor = Doktor.objects.get(id=doktorID)
  except:
   return HttpResponse(u'Aradığınız doktor bulunamadı. ID= %s' % (doktorID))

 if request.method == 'POST':
  form = DoktorFormu(request.POST)

  if form.is_valid():
   temiz_veri = form.cleaned_data
   if not doktorID: doktor = Doktor()
   doktor.adi= temiz_veri['adi']
   doktor.soyadi = temiz_veri['soyadi']
   doktor.telefon = temiz_veri.get('telefon')
   doktor.eposta = temiz_veri.get('eposta')
   doktor.save()
   return HttpResponseRedirect('/doktorlar/')
 else:
  if doktorID:form = DoktorFormu(initial=doktor.__dict__)
  else: form = DoktorFormu()

 return render_to_response('form.html',
        {'form':form,'baslik':'Öğretim Elemanı İşlemleri'},
        context_instance = RequestContext(request))

Daha önce söylemiştik: GET metodu bir sayfa yenilendiğinde her zaman çalışır. Yani POST metodundaki gibi belirtmemiz gerekmiyor. Şimdi doktor_ekleme görünümünün adımlarını inceleyelim.
  • 2.satır: GET metodu ile id parametresinin değerini alıyoruz.
  • 4.satır: id parametresi ile bir değer gönderilmiş mi ? kontrol ediyoruz.
  • 6.satır: Eğer id gelmiş ise, o id'e ait doktoru veritabanında çekiyoruz.
  • 8.satır: Veritabanında doktoru çekerken eşleşme yapılamazsa öyle bir doktor olmadığını kullanıcıya bildiriyoruz.
  • 10.satır: Sayfanın Post edildiğinin kontrolünü yapıyoruz. Eğer POST edilmemişse 22.satıra atlanılacaktır.
  • 11.satır: Daha önce oluşturduğumuz DoktorFormu içerisine POST ile gelen değerleri gönderiyoruz.
  • 13.satır: DoktorFormu'na gönderilen değerlerin Form'un istediği değerler ile uyuşup uyuşmadığını kontrol ediyoruz.
  • 14.satır: Gelen verileri temizleyerek temiz_veri değişkenine atıyoruz.
  • 15.satır: Eğer doktorID boş ise yani id parametresine bir değer atanmamış ise doktor değişkenine Doktor() veritabanına eşitleyerek yeni veri ekleyeceğimizi bildiriyoruz. Eğer doktorID dolu ise atama işlemini zaten 6.satırda yapmıştık.
  • 16-19.satır Bu satırlar arasında veritabanındaki alanlara atama işlemini yapıyoruz. Zorunlu olmayan alanları hata olmaması için Post.get metodu ile aldığımıza dikkat edin. Bunu daha önce de söylemiştik.
  • 20.satır: Son atadığımız alanları veritabanına kaydediyoruz.
  • 22.satır Eğer görünüme POST edilerek gelinmedi ise bu blok çalışacaktır.
  • 23.satır: Eğer id parametresine değer atandı ise o değere sahip doktoru bularak doktor değişkenine atmıştık. Burada initial özelliğini kullanarak DoktorForm'u alanlarına varsayılan değer olarak doktor içerisindeki değerleri atıyoruz. Eğer id parametresine değer atanmadı ise boş bir DoktorFormu gönderiyoruz.
  • 26.satır: Şablon'a oluşturduğumuz formu gönderiyoruz.

Kayıt Silme
Kayıt düzenlemede olduğu gibi kayıt silme işlemi yapmadan önce doktor-listesi şablonuna sil butonunu koyalım.
###doktor_listesi.html
<table border="1">
    <tr><th>Sıra</th><th>Adi</th><th>Soyadi</th><th>Telefon</th><th>E-Posta</th><th>İşlem</th></tr>

    {% for doktor in doktorlar %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ doktor.adi }}</td>
        <td>{{ doktor.soyadi }}</td>
        <td>{{ doktor.telefon }}</td>
        <td>{{ doktor.eposta }}</td>
        <td><a href="/doktor-ekle/?id={{ doktor.id }}">Düzenle  </a><a href="/doktor-ekle/?id={{ doktor.id }}&sil=1">Sil</a></td>
    </tr>
    {% endfor %}

</table>
Adres çubuğuna http://localhost:8000/doktorlar/ yazdığımız da çıktı şu şekilde değişecek.
Şimdide doktor_ekleme görünümünü düzenleyelim.

def doktor_ekleme(request):
 doktorID = request.GET.get('id')

 if doktorID:
  try:
   doktor = Doktor.objects.get(id=doktorID)
  except:
   return HttpResponse(u'Aradığınız doktor bulunamadı. ID= %s' % (doktorID))

        ###silme işlemi için ekliyoruz
 if request.GET.get('sil'):
  doktor.delete()
  return HttpResponseRedirect('/doktorlar/')

 if request.method == 'POST':
  form = DoktorFormu(request.POST)

  if form.is_valid():
   temiz_veri = form.cleaned_data
   if not doktorID: doktor = Doktor()
   doktor.adi= temiz_veri['adi']
   doktor.soyadi = temiz_veri['soyadi']
   doktor.telefon = temiz_veri.get('telefon')
   doktor.eposta = temiz_veri.get('eposta')
   doktor.save()
   return HttpResponseRedirect('/doktorlar/')
 else:
  if doktorID:form = DoktorFormu(initial=doktor.__dict__)
  else: form = DoktorFormu()

 return render_to_response('form.html',
        {'form':form,'baslik':'Öğretim Elemanı İşlemleri'},
        context_instance = RequestContext(request))
Eğer sil parametresine değer ataması yapıldıysa doktorID ait doktor'u veritabanından siliyoruz. Son olarak doktorlar sayfasına doktor ekleyebilmek için Doktor Ekle butonu ekleyelim. Bunun için doktor_listesi.html şablonun istediğiniz bir yerine şu satırı ekleyin.
<a href="/doktor-ekle/">Doktor Ekle</a>
Yaptığımız uygulamalarda tüm işlemleri tek bir görünüm üzerinden yaptık. Eğer isterseniz farklı görünümler üzerinden de yapabilirsiniz. Silme işlemini farklı bir görünüm ile yapalım.
İlk önce urls.py dosyasına şu satırı ekleyelim.
url(r'^doktor-sil/',yonetim.views.doktor_silme),
Daha sonra doktor_listesi.html şablonunu değiştirelim.
<table border="1">
    <tr><th>Sıra</th><th>Adi</th><th>Soyadi</th><th>Telefon</th><th>E-Posta</th><th>İşlem</th></tr>

    {% for doktor in doktorlar %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ doktor.adi }}</td>
        <td>{{ doktor.soyadi }}</td>
        <td>{{ doktor.telefon }}</td>
        <td>{{ doktor.eposta }}</td>
##doktor-sil sayfasına yönlendirdik.
        <td><a href="/doktor-ekle/?id={{ doktor.id }}">Düzenle  </a><a href="/doktor-sil/?id={{ doktor.id }}">Sil</a></td>
    </tr>
    {% endfor %}

</table>
Son olarak da doktor_silme görünümünü oluşturalım.
def doktor_silme(request):
 doktorID = request.GET.get('id')
 if doktorID:
  try:
   doktor = Doktor.objects.get(id=doktorID)
  except:
   return HttpResponse(u'Aradığınız doktor bulunamadı. ID= %s' % (doktorID))

 doktor.delete()
 return HttpResponseRedirect('/doktorlar/')
Aynı işlemi farklı görünüm üzerinden yapmış olduk. Sizde güncelleme işlemini farklı görünüm üzerinden yapmayı deneyin.
Kaynakça
  • Mustafa Başer Django Kitabı

1 yorum :

  1. Düzenlemede forma yazdırıyor tamam ama veri tabanına kaydetmiyor.

    YanıtlaSil