Python Django Türkçe Karakter Sorunu

607 views
Skip to first unread message

Halit

unread,
May 4, 2012, 11:22:07 AM5/4/12
to Python Istanbul
Merhabalar.

Ben Django ile blogumu geliştiriyorum.Şu anda da çok büyük kısmını
tamamladım.Ancak bu sırada ufak bir sorunla karşılaştım.Çünkü ufak
diyorum çözümünü kendim çözdüm ancak daha optime bir çözümü varmı diye
sizlere sormak istiyorum.

Sorunum şu şekilde admin panelinden blog yazımı eklerken başlık
kısmına yazdıklarımı temamda uygun yerde çekiyorum.Ancak temamda
kullandığım font türkçe karakterleri bozuk çıkarıyor.Bu yüzden yapmak
istediğim baslik_anasayfa adında yeni bir kolon açıp buraya otomatik
fonksiyon ile başlığı dönüştürmesi.

Örnek ile anlatmak gerekirse "Merhaba Dünya" olan başlığı "Merhaba
Dunya" şeklinde dönüştürmek istiyorum.

Django'nun birçok template tagına,filterına baktım ancak işime
yarayacak olan bulamadım.Bende modellerime ufak bir fonksiyon ekleyip
burada gelen kelimelerde ç,ğ,ü,ş,ı kelimeleri arayıp bunları
sözlükteki uygun kelimelerle değiştirmesini sağladım.Ancak bunu
yaptıktan sonra aklıma takılan nokta, acaba fazladan yük bindirmiş
olurmuyum oldu.Bu yüzden yazıyı admin panelinden girerken
baslik_anasayfa bölümüne anasayfaya çıkacak başlığı kendi elimle
yazacak duruma getirdim.Bu sorunumu şimdilik halletti ancak ben
sizlerden bu işi kolayca halledebileceğim hem django hem de python
çözüm yollarınızı bekliyorum.

İyi günler

Murat Çorlu

unread,
May 4, 2012, 11:27:42 AM5/4/12
to python-...@googlegroups.com
Modele attribute eklemek pek doğru gelmedi bana. Bunun yerine "clean_tr_chars" gibi bir template filter yazıp, template'te bu metni yazdıracağınız yerlerde bu filtreyi kullansanız daha temiz bir çözüm olur bence.

-- 
Murat Çorlu

Alper Kanat

unread,
May 4, 2012, 12:11:15 PM5/4/12
to python-...@googlegroups.com
Selam,

Belki öğrenmek için de yapıyorsunuz ama benim yazdığım bir blog projesi var: https://github.com/tunix/raptiye

İşinize yararsa olduğu gibi kullanabilir ya da kodunu alıp istediğiniz gibi kendi projelerinizde kullanabilirsiniz.

---
Quis custodiet ipsos custodes?

Mirat Bayrak

unread,
May 4, 2012, 12:12:58 PM5/4/12
to python-...@googlegroups.com
4 Mayıs 2012 18:27 tarihinde Murat Çorlu <murat...@gmail.com> yazdı:
> Modele attribute eklemek pek doğru gelmedi bana. Bunun yerine
> "clean_tr_chars" gibi bir template filter yazıp, template'te bu metni
> yazdıracağınız yerlerde bu filtreyi kullansanız daha temiz bir çözüm olur
> bence.

blog başlıkları sadece kayıt anında güncellenmesi gereken bir bilgi
olduğuna göre model üstünde bir field açıp her kayıtta onu güncellemek
daha sağlıklı geliyor bana da.

--
http://miratcan.tumblr.com / http://github.com/miratcan/

Halit Alptekin

unread,
May 4, 2012, 12:18:29 PM5/4/12
to python-...@googlegroups.com
Sizin söylediğiniz bana daha yakın geliyor.

class Yazilar(models.Model):
   nid = models.IntegerField(unique=True, db_index=True, null=True, blank=True)
   
   baslik        = models.CharField(max_length=255, verbose_name="Baslik")
   baslik_anasayfa  = models.CharField(max_length=255, verbose_name="Baslik Anasayfa")
   slug          = models.SlugField(max_length=255, verbose_name="Slug")
   
   icerik_anasayfa  = models.TextField(verbose_name="Anasayfa Icerik")
   icerik       = models.TextField(verbose_name="Tum Icerik")   
   etiketler     = TagField(verbose_name="Etiketler")
   
   olusturulma    = models.DateTimeField(auto_now_add=True, verbose_name="Olusturulma Tarihi")
   degistirilme = models.DateTimeField(auto_now=True, verbose_name="Degistirilme Tarihi")
   
   kategori = models.ForeignKey("Kategoriler", verbose_name="Kategori")
   yazar = models.ForeignKey(User, verbose_name="Yazar")

   def __unicode__(self):
       return force_unicode(self.baslik)
  
   def get_tags(self):
  return Tag.objects.get_for_object(self)
  
   class Meta:
  verbose_name_plural = "Blog Yazisi"
  
   def get_absolute_url(self):
  return "/%s.html" %self.slug

Kullandığım model yukarıda.Buradaki  baslik_anasayfa değerine turkish(baslik) gibi bir fonksiyon yapıp eklesem daha sağlıklı gibi geldi.Ancak bu fonksiyonu tam olarak nerede kullanmam doğru olur ondan emin değilim.Birde fonksiyonu en az sorgu yapacak şekilde nasıl yapacam emin değilim.Takılıp kaldım :S

4 Mayıs 2012 19:12 tarihinde Mirat Bayrak <miratca...@gmail.com> yazdı:



--
www.halitalptekin.com | Halit Alptekin

Mirat Bayrak

unread,
May 4, 2012, 12:25:16 PM5/4/12
to python-...@googlegroups.com
böyle durumlarda save metodu ovveride ediliyor. şuradan bakabilirsin,
tam da seninkine benzer bir örnek vermişler

https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

ama en temizi tekerleği baştan icat etmek yerine etraftaki onlarca
blog motorundan birini alıp kullanmak :) raptiyeyi denemedim ama güzel
gözüküyor :)

Murat Çorlu

unread,
May 4, 2012, 12:25:33 PM5/4/12
to python-...@googlegroups.com
Eklenen alan client tarafında seçilen bir fontun türkçe karakter desteklememesi problemine çözüm olarak düşünülmüş. Yani farklı bir font kullanılsa o alana ihtiyaç yok. Django application'ları geliştirirken generic çözümler üzerine yoğunlaşmak gerektiğinde hemfikirizdir sanırım. dolayısıyla bu tarz bir problem için databasede sayfa başlığının türkçe karakter'den arındırılmış halini de saklamak makul gelmiyor. O basit replace kodunu her sayfa gösteriminde çalıştırmak, veritabanından fazladan bir alan çekmekten daha ucuz olacaktır. İleride fontu Türkçe karakter destekler hale getirmek çözümü uygulandığında(aslında çözüm burada aranmalıdır - bkz: font-face), database'de bir alter yapma zorunluluğundan veya gereksiz bir kolonu orada bırakmaktansa, filtreyi kaldırmak da daha kolay olacaktır.

-- 
Murat Çorlu

Mirat Bayrak

unread,
May 4, 2012, 12:32:17 PM5/4/12
to python-...@googlegroups.com
> O basit replace kodunu her sayfa gösteriminde çalıştırmak, veritabanından fazladan bir alan çekmekten daha ucuz olacaktır.

bana kalırsa baya tartışma götürür bir konu, iki yöntemi de denese
birisi sonuçlardan güzel blog yazısı çıkar :)

Halit Alptekin

unread,
May 4, 2012, 12:41:51 PM5/4/12
to python-...@googlegroups.com
Raptiyenin bazı bölümlerini(etiket sistemi,admin paneli,arama paneli) blogumda kullanıyorum.Daha doğrusu ilham alıp ne yaptığını anlamaya çalışıyorum.Yani raptiyede haberdarım :D

4 Mayıs 2012 19:11 tarihinde Alper Kanat <tu...@raptiye.org> yazdı:



--
www.halitalptekin.com | Halit Alptekin

Halit Alptekin

unread,
May 4, 2012, 12:45:15 PM5/4/12
to python-...@googlegroups.com
Birde söylemek istediğim bir konu var.Burda kullanacağım sistemi sadece anasayfadaki başlık kısımda kullanmayacağım.Seo amaçlı olarak meta description kısmında da kulanacağım.Yani amacım sadece günü kurtarıp bu temayı işlevli kılmak değil.Yardımlarınız için teşekkürler.Önerileriniz doğrultusunda araştırmaya devam ediyorum :D

--
www.halitalptekin.com | Halit Alptekin

Ahmet AYGÜN

unread,
May 4, 2012, 12:50:58 PM5/4/12
to python-...@googlegroups.com
Merhaba

SlugField kullanmayı düşündünüz mü bilmiyorum ama bir göz atın isterseniz.

Hatta google'da "django slugify" seklinde aratirsaniz cozume de ulasacaginizdan eminim. Su an 2. sirada cikan site unicode slugify hakkinda guzel bilgiler iceriyor.

--
Ahmet AYGÜN

Mirat Bayrak

unread,
May 4, 2012, 12:52:59 PM5/4/12
to python-...@googlegroups.com
> SlugField kullanmayı düşündünüz mü bilmiyorum ama bir göz atın isterseniz.

ben de tam onu yazıyordum

Halit Alptekin

unread,
May 4, 2012, 1:12:26 PM5/4/12
to python-...@googlegroups.com
Bahsettiğinizi düşündüm hatta o linkede baktım.Ancak doğru bir şekilde çalıştıramadım.Aldığım hata

TypeError: 'SlugField' object is not iterable
 
Bu yüzden araştırmaya biraz daha devam ediyorum.Ama hissediyorum çok yaklaştım :D

4 Mayıs 2012 19:50 tarihinde Ahmet AYGÜN <m...@ahmetaygun.net> yazdı:



--
www.halitalptekin.com | Halit Alptekin

Berker Peksağ

unread,
May 4, 2012, 2:17:35 PM5/4/12
to python-...@googlegroups.com
2012/5/4 Halit Alptekin <diqi...@gmail.com>:
> Bahsettiğinizi düşündüm hatta o linkede baktım.Ancak doğru bir şekilde
> çalıştıramadım.Aldığım hata
>
>> TypeError: 'SlugField' object is not iterable
>
>
> Bu yüzden araştırmaya biraz daha devam ediyorum.Ama hissediyorum çok
> yaklaştım :D

Selam Halit,

Örnek bir kullanımına şuradan göz atabilirsin:
https://github.com/berkerpeksag/berkerpeksag/blob/master/blog/models.py#L17

--Berker

Halit Alptekin

unread,
May 4, 2012, 2:54:48 PM5/4/12
to python-...@googlegroups.com
Hepinize yardımlarınız için çok teşekkür ederim.Sorunu kendim çözdüm.Sizlere çözümünü de göstermek isterim.

Yazilar modelimin hemen altına

   def save(self, *args, **kwargs):
       self.baslik_anasayfa = unidecode(self.baslik)
       super(Yazilar, self).save(*args, **kwargs)

Şeklinde  bir fonksiyon ekledim.Buradaki fonksiyon ile başlığa girdim yazıyı otomatik olarak tam istediğim hale getiriyor.

Daha sonra template dosyamda {{ yazi.baslik_anasayfa|title }} şeklinde kullanarak sorunu çözdüm.



--
www.halitalptekin.com | Halit Alptekin

Reply all
Reply to author
Forward
0 new messages