2464

Python ile Sıfırdan İleri Seviye Python Programlama

Django Url Parametreleri

Django dersleri serimizin bu bölümünde url parametreleri ile nasıl çalışırız, öğrenelim.

Django Url Parametreleri

 

Tanımladığımız url şemaları bazen dinamik olması gerekir. Örneğin; dinamik olarak listelediğimiz bir blog listesi elemanlarının detay bilgisini göstereceğimiz blog detay sayfası her bloğu birbirinden ayırmak için benzersiz bir veriye ihtiyaç duyar. Örneğin;

http://127.0.0.1:8000/posts/1
http://127.0.0.1:8000/posts/2

blog listesi elemanlarından 1 ve 2 nolu blog için farklı url şeması tanımlıyor olmamız gerekiyor. Peki bu şekilde bir url şemasını ekleyelim.

urlpatterns = [
    path("", views.index, name="home"),
    path("index", views.index),
    path("posts", views.posts,name="posts"),
    path("posts/<int:id>", views.details, name="details"),
]

eklediğimiz son url şemasına dikkat edelim. Burada eşleşmesi gereken url iki bölmeden oluşmalıdır.

posts/<int:id>

posts her zaman sabit ancak id bölümü değişen sayısal bir bilgiye (int) karşılık gelmesi gerekiyor. Dolayısıyla 

http://127.0.0.1:8000/posts/1
http://127.0.0.1:8000/posts/2

bu şekildeki url şeması bizi views.details view metoduna yönlendirecektir. O halde details metodunda id bilgisini bekliyor olmamız gerekiyor. Çünkü gelecek olan değişken veriyi almamız ve bu id ile eşleşen kaydı veri tabanından sorgulayıp detay sayfamızda göstermemiz gerekir. 

def details(request, id):    
    data = {"id": id}
    return render(request, "blog/details.html", data)

details metodu ile url' den gelen id bilgisini alıp details.html sayfasına gönderiyoruz.

details.html sayfasında ise bu bilgiyi ekrana yazdıralım.

{{ id }}

Artık http://127.0.0.1:8000/posts/1 url' sindeki 1 bilgisini ekrana yazdırıyoruz. O halde bu sayısal bilgiyle eşleşen blog kaydını alıp details sayfasında gösterebiliriz.

Dinamik Url Oluşturma

Blog listesindeki her kayıt için dinamik bir url oluşturmamız gerekiyor.

index.html sayfasında blog başlığını linke çevirelim.

<h5 class="card-title">
    <a href="{% url 'details' blog.id %}"> {{ blog.baslik }} </a>
</h5> 

details ismindeki url şemasına her bloğun id bilgisini gönderiyoruz ve bu sayede bize listedeki her blog farklı bir url ile geliyor.

Peki bu aşamada her bloğun farklı adresi mevcut. Details ismindeki view metodunda da url den id bilgisini alabiliyoruz dolayısıyla artık blog_listesinden ya da bir veri tabanı kullanıyorsak veri tabanından ilgili id ile eşleşen kaydı alıp sayfada gösterebiliriz.

Biz bu aşamada basit bir blog listesi kullanıyoruz.

def details(request, id):
    selectedBlog = [blog for blog in blog_listesi if blog["id"]==id][0]

    return render(request, "blog/details.html", {
        "blog": selectedBlog,
        "kategoriler": kategori_listesi
    })

blog_listesi üzerinden her bloğu tek tek dolaşıyoruz. Her ulaştığımız blog bilgisinin id' si ile metoda gelen id bilgisiyle eşleşen kayıtlardan ilkini selectedBlog içerisine atıp sayfaya gönderiyoruz. Burada kullandığımız yapı "List Comprehension" konusudur.

details.html içeriğimiz;

  <div class="container mt-3">
        <div class="row">
            <div class="col-3">
                {% include 'partials/_categories.html' %}
            </div>
            <div class="col-9">
                
                <div class="card mb-3">
                    <div class="row">
                        <div class="col-md-3">                           
                            <img src="{{ blog.resim }}" class="img-fluid rounded-start">
                        </div>
                        <div class="col-md-9">
                            <div class="card-body">
                                <h5 class="card-title">
                                    {{ blog.baslik }}
                                </h5>
                            </div>
                        </div>
                    </div>
                </div>
            
            </div>
        </div>
    </div>


Kurs Sayfasına Git  
Paylaş