15 Mayıs 2014 Perşembe

Django'da Arama Formu Oluşturma

       Arama formları, verinin çok kabardığı durumlarda kullanıcıların istenilen veriye daha kısa yoldan ulaşması için tasarlanan formlardır. Hepimizin kullandığı arama motorlarını buna örnek olarak verebiliriz. 

       Bu gün burada, kendi yaptığımız bir uygulamaya arama formu nasıl eklenir sorusuna cevap vermek istiyorum. Geçen haftalarda üzerinde çalıştığımız okul projesinde öğretim elemanlarımıza ait bir listemiz vardı, bu liste biz her yeni bir öğretim görevlisi eklediğimizde büyüyecektir ve veri kümemiz büyüdükçe aradığımızı bulmamız daha güç hal alacaktır. Şimdi öğretim elemanları listemize bir arama formu ekleyelim. 

      Arama formunu oluşturmak için  ...\okul\yonetim\forms.py dosyasına arama formumuzu aşağıdaki gibi ekleyelim :

forms.py
...

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 az olamaz !..')
        return kelime




Yukardaki formdan anlayacağınız gibi üç harften daha az içeren kelimeler arandığında kullanıcıya hata iletisi gösterilmektedir. Şimdi bu formumuzu görünüme ekleyelim. Bunun için   ...\okul\yonetim\views.py dosyasının import kısmına aşağıdaki satırı ekleyelim:


from django.db.models import Q


Bu satırdan anlayacağınız gibi geçen haftalarda öğrendiğimiz Q nesnesini kullanacağız. Şimdi ogretim_elemanlari_listesi adlı görünümümüzü aşağıdaki gibi değiştirelim : 



...
def ogretim_elemanlari_listesi(request):
        .
    .
    .
            
    ogretim_elemanlari_tumu = OgretimElemani.objects.order_by(siralama)

    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']
            ogretim_elemanlari_tumu = OgretimElemani.objects.filter(
                Q(adi__contains=aranacak_kelime) | Q(soyadi__contains = aranacak_kelime))

    ogretim_elemanlari_sayisi = ogretim_elemanlari_tumu.count()
    .
    .
    .
    return render_to_response('ogretim_elemanlari_listesi.html',locals())


Yukarıda bir arama formu oluşturduk ve bu arama formunun kullanılması durumunda yapılcak işlemleri tanımladık. Q nesnesini ise aranacak kelimemizi öğretim elemanlarının ad ve soyadlarının arasında arama yapmak için kullandık.

Artık tüm bu yaptıklarımızı öğretim elemanları listesi şablonumuza ekleyelim. Bunun için şablonumuzu aşağıdaki gibi değiştirelim :
ogretim_elemanlari_listesi.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
<head>
    <link rel="stylesheet" type="text/css" href="css/bootstrap.css"/>
    <title> Öğretim Elemanları Listesi </title>
</head>
<body>
{% load bootstrap3 %}

{# Load CSS and JavaScript #}

{% bootstrap_css %}
{% bootstrap_javascript %}


{% bootstrap_messages %}

{# Display a form #}


<div class="panel panel-success">

    <div class ="panel-heading"> <h1> Öğretim Elemanları Listesi </h1></div>
    
    <br></br>

    <!-- formu ekle  -->                                                                        
    <form class="well form-search" method="GET">                                             
        <div style="width:200px" align="left">                                                             
            {% if arama_formu.aranacak_kelime.errors %}                                                    <!-- formda hata var ise  -->    
            <span class="label label-warning">  Aranacak kelime 2 harften az olamaz !.</span>  
            {% endif %}                                                                                                                                                                                

            <h3><span class="label label-default">{{arama_formu.aranacak_kelime.label}}</span></h3>
               
            <!-- aranacak kelime  -->
            <input type="text" class="form-control" {{arama_formu.aranacak_kelime}} 
                                                                                                         <!-- ara butonu -->
            {% buttons %}
            <button type="submit" class="btn btn-primary btn-sm">{% bootstrap_icon "search" %} BUL </button>
            {% endbuttons %} 
                
        </div>

    </form>

    {% if aranacak_kelime %}                                                                              
         <h3> Aradığınız <span class="label label-info">"{{aranacak_kelime}}"</span> için bulunan sonuçlar:</h3>                                                                                         
    {% endif %}                                                                                        
    <!-- Eğer aramada eşleşen öğretim elemanı yok ise kullanıcıya bilgi ver                         yoksa bulunan verileri listele   -->
    {% if ogretim_elemanlari_sayisi %}
    
    <table class="table table-bordered table-hover" width="500" >
    
        <thead>
            <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=3">E-posta adresi </a></th> 
            </tr>
        </thead>

        <tbody>
            {% 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 %}
        </tbody>
    </table>

</div>

        <ul class="pagination pagination-centered">
            {% if ogretim_elemanlari.has_previous %}
                 <li class="active"><a href="?sayfa={{ogretim_elemanlari.previous_page_number}}">Önceki</a></li>
            {% endif %}
            
            {% for s in ogretim_elemanlari.paginator.page_range %}
             <li ><a href ="?sayfa={{s}}">{{s}}</a></li>
            {% endfor %}
            
            {% if ogretim_elemanlari.has_next %}
                 <li class="active"><a href="?sayfa={{ogretim_elemanlari.next_page_number}}">Sonraki</a></li>
            {% endif %}
        </ul>


        <p><a href = "/ogretim-elemani-ekleme/"> Yeni Kayit</a></p>
        
        {% else %}
        <!-- aranan kritere göre veri yok ise kullanıcıya bilgi ver  -->
        <span class="label label-info">Aradığınız kriterlere göre öğretim elemanı bulunamadı bulunamadı.</span>
            
        {% endif %}
    </body>
</html>




Web tarayıcımızdan öğretim elemanları listemizi açtığımızda görüntümüz aşağıdaki gibi olacaktır :


Arama formu

Aranan kritere göre öğretim elemanları

Aranan kritere göre veri bulunamadı

3 harften az kriter sorgulandığında 

Referanslar :
  1. https://docs.djangoproject.com/en/dev/
  2. http://django-bootstrap3.readthedocs.org/en/latest/index.html
  3. http://www.djangobook.com/
  4. http://stackoverflow.com/
  5. BAŞER, Mustafa (2013). Django

Hiç yorum yok:

Yorum Gönder