7 Nisan 2014 Pazartesi

Django'da Formlar - III

Merhaba Arkadaşlar,

Geçen hafta Django formlarını, Django form denetimi ve formların görünümlerle kullanılması gibi konuları öğrendik. Bu hafta ise geçen hafta yaptığımız işlemleri bir adım daha öne taşıyalım. Yani eklenen kayıtların düzenlenmesi, silinmesi ve sıralanmasına bakalım.


KAYIT DÜZENLEME

Şimdi daha önceden tanımlanmış kayıtların düzenlenmesine bakalım. Django burada da bize kolaylık sağlıyor. Bunun için var olan form'a initial argümanını vermemiz yeterli olacaktır.
Geçen haftalarda olduğu gibi bu hafta da okul projemiz üzerinden devam edeceğiz. Şimdi projemizde bir kaç ufak değişiklik yapalım. Öncelikle GET yönteminde adres satırına yazılan bilgileri alabildiğimizi hatırlayalım. Bunu düzenleyeceğimiz verinin bilgilerini forma dökmek için kullanacağız. Yani GET yöntemini kullanarak köprüler oluşturur ve burdaki verileri alabiliriz. Peki hangi öğretim elemanını düzenleyeceğimizi adres satırında nasıl göstereceğiz? Bu işlemi ancak bütün öğretim elemanlarına özgü ID numarasını bilerek yapabiliriz. Bunun için öğretim elemanı listesini oluştururken, üzerine köprü oluşturmamız(link vermemiz) gerekir. Bunu ogretim_elemanlari_listesi.html şablonunda yapacağız. Şablonumuzun  ilgili alanını aşağıdaki gibi değiştirelim:

okul\yonetim\sablonlar\ogretim_elemanlari_listesi.html
.
.
{% for ogr in ogretim_elemanlari %}
<tr>
    <td><a href = "/ogretim-elemani-ekleme/?id={{ogr.id}}">{{ogretim_elemanlari.start_index|add:forloop.counter0}} </a></td>
    <td><a href="/ogretim-elemani-ekleme/?id={{ogr.id}}">{{ogr.adi}}</a></td>
    <td><a href="/ogretim-elemani-ekleme/?id={{ogr.id}}">{{ogr.soyadi}}</a></td>
    <td>{{ogr.telefonu}}</td>
    <td>{{ogr.e_posta_adresi}}</td>

</tr>

{% endfor %}
.
.

Anlayacağınız üzre yukarıda sadece ufak birer köprü oluşturduk. Yani herhangi bir öğretim görevlisinin ID, adı ya da soyadı'na tıklanınca düzenleme sayfasına yönlendirileceğiz. Şimdi de ogretim_elemani_ekleme() görünümümüzde birkaç ufak değişiklik yapıp kaydedelim:

okul\yonetim\views.py\..ogretim_elemani_ekleme(request)..
.
.
def ogretim_elemani_ekleme(request):

    ogrElmID = request.GET.get('id')

    if ogrElmID:
        try:
            ogrelm = OgretimElemani.objects.get(id = ogrElmID)
        except:
            return HttpResponse(u'Aradiginiz ogretim elemani bulunamiyor: ID=%s' % ogrElmID)

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

        if form.is_valid():
            temiz_veri = form.cleaned_data
            if not ogrElmID : ogrelm = OgretimElemani()
            ogrelm.adi = temiz_veri['adi']
            ogrelm.soyadi = temiz_veri['soyadi']
            ogrelm.telefonu = temiz_veri.get('telefonu')
            ogrelm.e_posta_adresi = temiz_veri.get('e_posta_adresi')
            ogrelm.save()
            return HttpResponseRedirect('/ogretim-elemanlari-listesi/')

    else:
        if ogrElmID : form = OgretimElemaniFormu( initial = ogrelm.__dict__)
        else: form = OgretimElemaniFormu()

    return render_to_response('genel_form.html',
                              {'form':form,'baslik':'Ogretim Elemani Ekleme'},
                              context_instance = RequestContext(request))
.
.



Gördüğünüz gibi ilk olarak öğretim elemanının ID'si geliyor mu onu kontrol ettik. Eğer öyle bir ID'ye sahip bir öğretim elemanı mevcut değilse bu durum kullanıcıya bildiriliyor. POST yöntemi ile gönderilmiş form; geçerli ve gelen ID'li öğretim elemanı var ise yeni bir öğretim elemanı nesnesi oluşturulmayacaktır. Aksi durumda boş bir öğretim elemanı nesnesi oluşturuluyor ve formdan gelen bilgiler ile öğretim elemanı nesnesinin alanlarını güncelleyerek kaydedeceğiz..

KAYIT SİLME 

Bu işlem için de yukarda yaptığımız gibi bir köprü oluşturarak halledebiliriz. Bunun için ana şablonumuzda form bitimine aşağıdaki satırları ekleyelim:

 okul\yonetim\sablonlar\genel_form.html
.
.
{% if ID %}
<a href = "/?id={{ID}}&sil={{ID}}"> Bu kaydi sil.</a>
{% endif %}
.
.

Görünümümüzü de aşağıda gibi değiştirelim:

okul\yonetim\views.py\..ogretim_elemani_ekleme(request)..
def ogretim_elemani_ekleme(request):

    ogrElmID = request.GET.get('id')

    if ogrElmID:
        try:
            ogrelm = OgretimElemani.objects.get(id = ogrElmID)
        except:
            return HttpResponse(u'Aradiginiz ogretim elemani bulunamiyor: ID=%s' % ogrElmID)

    if request.GET.get('sil'):
        ogrelm.delete()
        return HttpResponseRedirect('/ogretim-elemani-listesi/')
        
    
    if request.method =='POST':
        form = OgretimElemaniFormu(request.POST)

        if form.is_valid():
            temiz_veri = form.cleaned_data
            if not ogrElmID: ogrelm = OgretimElemani()
            ogrelm.adi = temiz_veri['adi']
            ogrelm.soyadi = temiz_veri['soyadi']
            ogrelm.telefonu = temiz_veri.get('telefonu')
            ogrelm.e_posta_adresi = temiz_veri.get('e_posta_adresi')
            ogrelm.save()
            return HttpResponseRedirect('/ogretim-elemanlari-listesi/')

    else:
        if ogrElmID: form = OgretimElemaniFormu(initial = ogrelm.__dict__)
        else: form = OgretimElemaniFormu()

    return render_to_response('genel_form.html',
                              {'form':form,'baslik':'Ogretim Elemani Ekleme'},
                              context_instance = RequestContext(request))




İsterseniz öğretim elemanları listesi görüntülenirken yeni kayıt eklemek için de bir köprü koyabiliriz. Bunun için ogretim_elemanlari_listesi.html şablonunda tablonun bitimine aşağıdaki satırları eklememiz yeterli olacaktır:


okul\yonetim\sablonlar\ogretim_elemanlari_listesi.html
.
.
</table>

<p><a href = "/ogretim-elemani-ekleme/"> Yeni Kayit</a></p>
</body>
.
.


SIRALAMALAR 

Hatırlayacağınız gibi öğretim elemanı modelini tanımlarken sıralamayı soyadına göre yapmıştık.

class OgretimElemani(models.Model):
    adi = models.CharField(max_length =50)
    soyadi = models.CharField(max_length =50)
    telefonu = models.CharField(max_length =10,blank=True)
    e_posta_adresi = models.EmailField(blank = True)

    def __unicode__(self):
        return u'%s, %s' %(self.soyadi,self.adi)
    class Meta:
        ordering =['soyadi']

Ancak birçok kullanıcı tablo halinde sunulan verileri farklı tablo sütunlarına göre de sıralanmasını isteyebilir. Şimdi bunun için ufak bir demo yapalım. Öncelikle ogretim_elemanlari_listesi.html şablonunda tablo sütun başlıklarına köprüler kuralım :

okul\yonetim\sablonlar\ogretim_elemanlari_listesi.html
.
.
<tr> 
<th> Sıra</th>
<th><a href="?sirala=1">Adı</a></th>
<th><a href="?sirala=2">Soyadı</a></th>
<th>Telefonu </th>
<th><a href="?sirala=1">E-posta adresi </a></th> 
</tr>
.
.

Görünüme de listelemeyi yapacak ölçütleri vermemiz gerekir. Bunu da ogretim_elemanlari_listesi(request) görünümümüzü aşağıdaki gibi değiştirerek yapabiliriz :


okul\yonetim\views.py\..ogretim_elemani_listesi(request)..
.
.
def ogretim_elemanlari_listesi(request):
    siralama='soyadi'
    olcut = request.GET.get('sirala')

    if olcut :
        siralamaOlcutleri={
            '1':'adi',
            '2':'soyadi',
            '3':'e_posta_adresi'
            
            }
        if olcut in siralamaOlcutleri:
            siralama = siralamaOlcutleri[olcut]
            
    ogretim_elemanlari = OgretimElemani.objects.order_by(siralama)
    return render_to_response('ogretim_elemanlari_listesi.html',locals())
.
.


Son durumda sıralamaları görmek istersek :

Sıralama-1 (Adı)

Sıralama-2(Soyadı)

Sıralama-3 (E-Posta-Adresi)



Referanslar :
  1. https://docs.djangoproject.com/en/dev/
  2. BAŞER, Mustafa (2013). Django
  3. http://www.djangobook.com/
  4. http://stackoverflow.com/


Hiç yorum yok:

Yorum Gönder