Ekim, 2009 Arşivi

Django: Bir Güncelleme Hikayesi

Internet üzerinde MVC web çerçeveleri kullanılarak sıfırdan uygulamalar geliştirmek üzerine bir çok makale var. Ben bu yazıda Django ile geliştirilmiş ve çevrimiçi olan bir siteye yeni özellik eklemeyi detaylı olarak anlatmak istiyorum. Amacım Django’nun mevcut uygulamalar üzerinde değişiklik yaparken sağladığı esneklik hakkında fikir vermek. Bir yandan da, küçük de olsa, gerçek hayatta kullanılan bir parça kodu göstermek.

Nakliyeci Rehberi, nakliye sektörüne hizmet veren bir firma rehberi. Ayrıca söktörel haberler ve ilanlara da yer veriliyor. Fakat ana özellik firma rehberi. Aşağıda anlatacağım güncellemede firmaların listelendiği sayfaların altına, arama motoru optimizasyonu için, açıklayıcı yazılar yerleştirilmek istendi. Bu yazıların dinamik olarak, sadece istenen şehirler için, eklenip çıkarılabilmesi gerekiyordu. Bir örnek için İstanbul Evden Eve Nakliyat Firmaları sayfasına bakabilirsiniz.

Plan basitçe iki maddede özetlenebilir:

  • Girdi: tanıtıcı yazı için bir model oluşturulması ve admin uygulamasıyla entegrasyonu.
  • Çıktı: bir şablon komutu (template tag) ile istenen tanıtıcı yazının çağrılması.

Model ve Admin

Modelimiz oldukça basit. Her bir şehir ve kategori için yalnızca bir tane tanıtım yazısı yaratılabilsin diye unique_together kullandım.

import datetime
from django.db import models


CATEGORY_CHOICES = (
    ('domestic', u'Evden Eve Nakliyat'),
    ('commercial', u'Nakliye ve Lojistik'),
)


class IntroductoryText(models.Model):
    city = models.CharField(u'Şehir', blank=False, unique=True)
    category = models.CharField(u'Kategori',
                                choices=CATEGORY_CHOICES,
                                max_length=20)
    introduction = models.TextField(u'Tanıtım Yazısı', blank=False)
    creation_timestamp = models.DateTimeField(u'Yaratılma Tarihi',
                                default=datetime.datetime.now, editable=False)
    class Meta:
        verbose_name = u'Şehir Tanıtımı'
        verbose_name_plural = u'Şehir Tanıtımları'
        unique_together = (('city', 'category'),)
        ordering = ('city',)

    def __unicode__(self):
        return u'%s %s tanıtımı' % (self.get_city_display(),
                                    self.get_category_display())

    @models.permalink
    def get_absolute_url(self):
        return ('catalogue-city-category',
                (),
                {'city_slug': slugify(self.get_city_display()),
                 'category_slug': slugify(self.get_category_display())})

Burada Türkçe karakterleri de destekleyen kendi slugify fonksiyonumu kullanıyorum.

Daha sonra admin.py içine IntroductoryText için gerekli tanımları ekledim:

from django.contrib import admin
from models import IntroductoryText


class IntroductoryTextAdmin(admin.ModelAdmin):
    list_display = ('city', 'category', 'creation_timestamp')
    list_filter= ('category', 'city')
    radio_fields = {'category': admin.VERTICAL}
admin.site.register(IntroductoryText, IntroductoryTextAdmin)

Böylelikle güncellemenin girdi kısmı tamamlandı.

Şablon Düzenlemeleri

Tanıtım yazılarını göstermek için çok baist bir şablon kumutu tanımlam yeterli oldu:

from django import template
from django.contrib.markup.templatetags.markup import markdown
from catalogue.models import Company, IntroductoryText


register = template.Library()


@register.simple_tag
def city_introduction(city_id, category_id):
    try:
        i = IntroductoryText.objects.get(city=city_id, category=category_id)
    except IntroductoryText.DoesNotExist:
        return u''
    return markdown(i.introduction)

Eğer verilen parametreler için tanıtım yazısı bulunamazsa, ki daha önce belirttiğim gibi her şehir için tanıtım yazısı olmayabilir, şablona boş metin döndürülüyor.

Tanıtım yazılarını görüntülemek için catalogue/company_list.html şablonuna aşağıdaki kodu ekledim:

<div>{% city_introduction city_id category_id %}</div>

Sonuç

Bu çok basit güncellemeyi mevcut kodlar üzerinde hiçbir değişiklik yapmadan sadece yeni kodları ekleyerek gerçekleştirdim. Bu yeni kodları sunucuya yükledikten sonra veritabanında IntroductoryText ile ilgili tablonun yaratılması için son olarak syncdb komutunu çalıştırdım.

./manage.py syncdb

Bu kadarı yeni özelliğin eklenmesi için yeterli olsa da önemli bir eksiklik var; en azından city_introduction şablon komutu için testlerin yazılması gerekiyor. Django ile geliştirme diğer antik geliştirme ortamlarına göre o kadar çevik ki emin olun testleri hazırlamak kazanılan zamanın çok ufak bir kısmını alacaktır.

Umarım bu yazı Django öğrenenlere veya öğrenmek isteyenlere yardımcı olur.

Etiketler: , ,

Çarşamba, Ekim 21st, 2009 Yazılım Yorumlar kapalı