Django pre_save ve slugify ile Slug Url Oluşturma

Merhaba arkadaşlar.

Bu yazı da size Django'da modellar için slug url oluşturmayı göstericem.Bunu da Django'nun bize sunduğu slugify() ve pre_save() fonksiyonları ile yapacaz.Elimizde şöyle bir model olduğunu düşünürsek;


class Yazilar(models.Model):
    title = models.CharField(max_length=10)
    date = models.DateTimeField(bla bla)
    content = models.TextField()

    slug = models.SlugField(unique=True, blank=True)

Burada modelımıza ek olarak bir slug adresini tutmak için SlugField ekliyoruz.Ulaşacağımız yazıya slug adresini kullanarak ulaşacağımız için "unique=True" ve boş bırakabilmek için "blank=True" opsiyonlarını giriyoruz.Benzersiz olabilmesi için bunun kontrolünü slug'ı kaydetmeden önce birazdan yazacağımız fonksiyonda göstereceğim.

Şimdi yapmamız gereken objeyi kaydet dediğimiz de objeyi kaydetmeden önce araya girip title ile bir slug değeri oluşturmak.Bu araya girme işlemini de yine Django'nun bize sunduğu pre_save() fonksiyonu ile yapıyoruz.

Kodumuza dönecek olursak pre_save() ve slugify() için şu modülleri import etmemiz gerekiyor modelımıza.


from django.db.models.signals import pre_save
from django.template.defaultfilters import slugify

slugify() kullanımı rahat ve oldukça basit.pre_save()'e bakacak olursak, bir fonksiyon yazarak yapıyoruz bu işlemi.Yani title'ı alıp slug oluşturacak fonksiyonu kendimiz yazıyoruz ve bunu Yazilar classını kaydetmeden önce çalıştırmak için çağırıyoruz.Belki biraz anlamsız bir cümle oldu ama birazdan kodu görünce rahatça anlayabileceğinize eminim.

pre_save() için fonksiyonu yazacak olursak.3 parametre ile yazılıyor; sender, model, kwargs. sender parametresi ile hangi classı kaydettiğimizde çalışacağını seçiyoruz, model ile de bu model'a ait verilere erişiyoruz.kwargs kaçınılmaz (:

pre_save işlemini yapacağımız fonksiyona gelirsek şu şekilde bir örnek yazabiliriz;


    def pre_save_yazilar_create(sender, m, **kwargs):
        slug = slugify(m.title)
        check = Yazilar.objects.filter(slug=slug).exists()
        if check:
            slug = "%s-%s" % (slug, m.id)
        m.slug = slug

    pre_save.connect(pre_save_yazilar_create, sender=Yazilar)

pre_save_yazilar_create() fonksiyonunun içindeki ilk satırda slugify() ile slug adresimizi oluşturduk.İkinci satırda bu slug'a ait bir başka yazı var mı onu kontrol ettik.Eğer var ise oluşturduğumuz slug'ın sonuna yeni oluşturulan objenin id değerini koyduk.En son olarakta bu objenin slug kolonuna yeni oluşturduğumuz slug değerini koyuyoruz.Yukarı da SlugField'a blank=True değerini girmemizin sebebi buydu.Çünkü objeyi kaydederken SlugField'ı boş bırakıyoruz.En alt satırda da pre_save_yazilar_create() fonksiyonumuzu modelımıza bağlıyoruz.

Ve evet, bu da bu kadar (:
Umarım faydalı olmuştur, kolay gelsin.


Tags: python, linux, django, slug