5 Mayıs 2014 Pazartesi

Arama Formu

Doktorları listeliyoruz. Peki doktor sayısının çok fazla olduğu durumlarda kullanıcı istediği bir doktara ulaşmak isterse ne olacak? Tüm sayfalar arasında dolanarak doktoru mu bulmaya çalışacak. Bu iyi bir web sitesine aykırı bir durumdur. Bunun için kullanıcının arama yapabileceği AramaFormu tasarlayalım. froms.py içerisine şu kodları yazalım.
class AramaFormu(forms.Form):
 aranacak_kelime = forms.CharField()

 def clean_aranacak_kelime(self):
  kelime = self.cleaned_data['aranacak_kelime']
  if len(kelime)<3:
   raise  forms.ValidationError('Aranacak kelime 3 harften fazla olmalıdır.')
  return kelime
Arama yapıldığında kelimeyi alarak görünümde işleyerek kullanıcıya istediği verileri gösterebiliriz. Bunun için views.py dosyasına Q nesnesini aktaralım.
from django.db.models import Q
Hatırlarsanız Q nesnesinden daha önce bahsetmiştik. Sorgu içerisinde AND yerine OR kullanmamızı sağlıyordu.
doktorlar_tum = Doktor.objects.order_by(siralama)
Bu satırdan sonraki kodları şu şekilde düzenliyoruz.
 arama_formu = AramaFormu()
 if request.GET.get('aranacak_kelime'):
  arama_formu= AramaFormu(request.GET)
  if arama_formu.is_valid():
   aranacak_kelime = arama_formu.cleaned_data['aranacak_kelime']
   doktorlar_tum = Doktor.objects.filter(
   Q(adi__contains=aranacak_kelime) | Q(soyadi__contains=aranacak_kelime)
   )


 doktorlar_sayfalari = Paginator(doktorlar_tum,5)
 doktorlar = doktorlar_sayfalari.page(int(sayfa))
 doktor_sayisi = doktorlar_tum.count()
 return render_to_response('doktor_listesi.html',locals())
Arama formundan gelen veriye göre filtreleme işlemini yaptık. Şimdi de doktor_listesi.html şablonundan arama formunu ekleyelim. Eğer herhangi bir sonuç bulunmazsa boş bir tablo geriye döndürülür. Bunu engellemek içindoktor_sayisi değişkenini kullanacağız.
<form method="GET">
    {{ arama_formu.aranacak_kelime.label }}
    {{ arama_formu.aranacak_kelime }}
    <input type="submit"  value="Ara"/>
    {{ arama_formu.aranacak_kelime.errors }}
</form>

{% if aranacak_kelime %}
<h3>"{{aranacak_kelime}}" için sonuçlar:</h3>
{% endif %}

{% if doktor_sayisi %}

<table border="1">
    <tr><td><a href="/doktor-ekle/">Doktor Ekle</a></td></tr>
    <tr>
        <th>Sıra</th>
        <th><a href="?siralama=1">Adi<a/></th>
        <th><a href="?siralama=2">Soyadi</a></th>
        <th>Yaş</th>
        <th>Telefon</th>
        <th>E-Posta</th>
        <th>İşlemler</th>
    </tr>

    {% for doktor in doktorlar %}
    <tr>
        <td>{{ doktorlar.start_index|add:forloop.counter }}</td>
        <td>{{ doktor.adi }}</td>
        <td>{{ doktor.soyadi }}</td>
        <td>{{ doktor.yas }}</td>
        <td>{{ doktor.telefon }}</td>
        <td>{{ doktor.eposta }}</td>

        <td><a href="/doktor-ekle/?id={{ doktor.id }}">Düzenle </a><a href="/doktor-sil/?id={{ doktor.id }}">Sil</a></td>
    </tr>
    {% endfor %}

</table>

{% if doktorlar.has_previous %}
    <a href="?sayfa={{ doktorlar.previous_page_number }}">Önceki</a>
{% endif %}

{% if doktorlar.has_previous or doktorlar.has_next%}
{{ doktorlar.number }}
{% endif %}

{% if doktorlar.has_next %}
    <a href="?sayfa={{doktorlar.next_page_number }}">Sonraki</a>
{% endif %}
</br>

{% else %}
  Aradığınız doktor bulunamadı.
{% endif %}

{% if doktor_sayisi %} kontrolünü yaparak eğer doktor bulundu ise formu gösteriyoruz. Doktor bulunamadı ise bulunamadığına dair bilgilendirme yapıyoruz.

Kaynakça
  • Mustafa Başer Django Kitabı

0 yorum :

Yorum Gönder