Template içerisinde dinamik veri

Birkaç parçayı yerine oturttuk: Post (gönderi) modelini models.py'de tanımladık, views.py'de post_list (gönderi listesi) var ve template ekledik. Ama gönderilerimizi HTML'de görünür kıldık mı? Çünkü bu yapmak istediğimiz şey: içeriği (veritabanında kayıtlı modellerimiz) al ve güzelcene template içerisinde göster, değil mi?

Bu tam olarak view'lerin yapmasını beklediğimiz şey: modelleri ve template'leri bağlamak. post_list view'de göstermek istediğimiz modelleri alıp template'e iletmemiz gerekecek. Yani temelde bir viewde template içinde neyin (hangi modelin) gösterileceğine karar veriyoruz.

Peki, bunu nasıl yapacağız?

blog/views.py'ı açacağız. Şu anda post_list viewü şöyle:

from django.shortcuts import render

def post_list(request):
    return render(request, 'blog/post_list.html', {})

Kodları farklı dosyalara eklemekten bahsettiğimizi hatırlıyor musunuz? Şimdi models.py'de yazdığımız modeli ekleme zamanı. from .models import Post satırını şu şekilde ekleyeceğiz:

from django.shortcuts import render
from .models import Post

from'dan sonraki nokta, mevcut dizin veya mevcut uygulama anlamına geliyor. views.py ve models.py aynı dizinde oldukları için sadece . ve dosyanın adı (.py olmadan) kullanabiliyoruz. Arkasından modelin adını (Post)'u dahil ediyoruz).

Sırada ne var? Post modelinden gönderileri almamız için QuerySet dediğimiz bir şeye ihtiyacımız var.

QuerySet (Sorgu Seti)

QuerySet'in nasıl çalıştığı konusunda bir fikriniz oluşmuştur. Django ORM (QuerySets) bölümünde konuşmuştuk.

Şimdi yayınlanmış ve yayinlama_tarihi'ne göre sıralanmış bir gönderi listesi istiyoruz, değil mi? Bunu QuerySets bölümünde yapmıştık zaten!

Post.objects.filter(yayinlama_tarihi__lte=timezone.now()).order_by('yayinlama_tarihi')

Şimdi bu kodu blog/views.py dosyasında def post_list(request) fonksiyonuna ekleyelim:

from django.shortcuts import render
from django.utils import timezone
from .models import Post

def post_list(request):
    posts = Post.objects.filter(yayinlama_tarihi__lte=timezone.now()).order_by('yayinlama_tarihi')
    return render(request, 'blog/post_list.html', {})

QuerySet'imiz için bir değişken yarattığımıza dikkat edin: posts. Bu QuerySet'in ismi. Bundan sonra ondan ismi ile bahsedebiliriz.

Bu kod timezone.now() fonksiyonunu kullanıyor, dolayısıyla timezone için bir 'import' eklememiz gerekiyor.

Son eksik kalan kısım posts QuerySet'ini template'e iletmek (nasıl göstereceğimizi bir sonraki bölümde işleyeceğiz).

render fonksiyonunda halihazırda request diye bir parametremiz var (dolayısıyla Internet üzerinden kullanıcı ile ilgili aldığımız her şey) ve bir de template dosyamız 'blog/post_list.html' var. {} şeklindeki son parametremiz, template içinde kullanılmak üzere bir şeyler ekleyebileceğimiz bir değişken. Bunlara isimler vermemiz gerekiyor ('posts' ismini kullanmaya devam edeceğiz şimdilik :)). Şöyle olması lazım: {'posts': posts}. :'dan önceki kısmın bir string olduğuna dikkat edin; etrafına tek tırnak koymanız gerekiyor ''.

Nihayetinde blog/views.py şu şekle gelmiş olmalı:

from django.shortcuts import render
from django.utils import timezone
from .models import Post

def post_list(request):
    posts = Post.objects.filter(yayinlama_tarihi__lte=timezone.now()).order_by('yayinlama_tarihi')
    return render(request, 'blog/post_list.html', {'posts': posts})

İşte bu kadar! Template'e geri gidip QuerySet'leri görünür hale getirme zamanı!

Django'da QuerySet'lerle ilgili daha fazla bilgi istiyorsanız şuraya bakabilirsiniz: https://docs.djangoproject.com/en/1.8/ref/models/querysets/

results matching ""

    No results matching ""