23 Ocak 2015 Cuma

Django Admin Panel Resim Thumbnail

Django'da model içerisinde imagefield kullandığınız zaman admin panelinde form içerisinde bu resmi göremiyoruz. Sadece resmin adı görünmektedir. Bu yazıda bu resmi küçük bir şekilde nasıl görebiliriz ondan bahsedeceğiz. İlk önce model oluşturalım.
#models.py
from django.db import models

class Image(models.Model):
    name = models.CharField(max_length=255)
    image = models.ImageField(upload_to="image")

İlk önce listeleme sayfasında resimleri gösterelim. Bildiğiniz gibi admin sayfasında elemanları listelerken list_display özelliği ile istediğimiz alanları ve istediğimiz herhangi bir fonksiyondan dönen değeri yazdırabiliyoruz. Şimdi model içerisinde bir fonksiyon oluşrulım ve bu fonksiyon bize resmi döndürsün.
class Image(models.Model):
    name = models.CharField(max_length=255)
    image = models.ImageField(upload_to="image")

    def image_thumb(self):
        return '<img src="%s" height="200" width="300"/>' % (self.image.url)
    image_thumb.short_description = 'Resim'
    image_thumb.allow_tags = True
Daha sonra admin.py içerisine şu kodları yazıyoruz.
from django.contrib import admin

class ImageAdmin(admin.ModelAdmin):
    list_display = ['name', 'image_thumb']

admin.site.register(Image, ImageAdmin)
Artık model satıları listelenirken resimleri görebiliyoruz.
Bu işlemden sonra resmin içeriğini görmek için tıklarsanır şöyle bir çıktı alacaksınız.
Gördüğünüz gibi resim görünmemekte sadece resmin yolu görünmektedir. Şimdi burada da resmi gösterelim. Yapmamız gereken admin.py dosyasına şu kodları eklemek.
from django.contrib.admin.widgets import AdminFileWidget
from django.utils.safestring import mark_safe


class ImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and hasattr(value, "url"):
            output.append(('<a target="_blank" href="%s">'
                           '<img src="%s" height="100" title="%s"/></a> '
                           % (value.url, value.url, value.name)))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))
Burada özel bir widget ekliyoruz. Bu widget aldığı alan için bir geri değer döndürecek. Son olarak yapmamız gereken ise image alanımıza bu widgetı tanımlamak bunun için yine admin.py dosyasında az önce yazdığımız ImageAdmin sınıfını değiştirmek.
class ImageAdmin(admin.ModelAdmin):
    list_display = ['name', 'image_thumb']
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'image':
            request = kwargs.pop("request", None)
            kwargs['widget'] = ImageWidget
            return db_field.formfield(**kwargs)
        return super(ImageAdmin, self).formfield_for_dbfield(db_field, **kwargs)


admin.site.register(Image, ImageAdmin)
Artık resmi düzenleme sayfasında da görebiliyoruz.
Siz burada kendinize göre biraz daha özelleştirebilirsiniz.

15 Ocak 2015 Perşembe

Bu yazıda basit bir şekilde google'ın captcha uygulamalarını sitemize nasıl import edebileceğimizden bahsedeceğiz.
reCAPTCHA
İlk önce https://www.google.com/recaptcha/intro/index.html adresinden kendimiz için bir recaptcha oluşturuyoruz. Buradaki Get reCAPTCHA butonuna tıkladığınızda size Site key ve Secret key oluşturacaktır. Bunları projemizde kullanacağız.
Bu işlemi yaptıktan sonra https://github.com/praekelt/django-recaptcha adresinden uygulamayı indiriyoruz. İndirdikten sonra
cd Downloads/django-recaptcha-develop/
sudo python setup.py install
komutlarını sırası ile çalıştırıyoruz. Kurduktan sonra settings.py dosyasında INSTALLED_APPS değişkenine uygulamayı eklemeliyiz.
INSTALLED_APPS = (
.....
    'captcha',
)
Daha sonra şu satırları settings.py dosyasına ekliyoruz.
RECAPTCHA_PUBLIC_KEY = 'Googledan aldığınız Site Key'
RECAPTCHA_PRIVATE_KEY = 'Googledan aldığınız Secret Key'
RECAPTCHA_USE_SSL = True
Son satır reCAPTCHA'nın SSL kullanması ile ilgili. Eğer isterseniz bu satırı kaldırabilirsiniz. reCAPTCHA'yı kullanmak için artık her şey hazır. Şimdi basitçe kullanalım. İlk basit bir form oluşturuyoruz.
from django import forms
from captcha.fields import ReCaptchaField

class reCAPTCHAForm(forms.Form):
    captcha = ReCaptchaField()
Şimdi bu formu kullanalım. Basit bir view oluşturalım.
from django.shortcuts import render
from go.forms import reCAPTCHAForm
# Create your views here.
def go(request):
 if request.method == "POST":
     form = reCAPTCHAForm(request.POST)
     if form.is_valid():
  """ Form başarılı ise yapılacaklar """
 else:
     form = reCAPTCHAForm() 
 return render(request, 'index.html', locals())
Bu viewa ait olan index.html şablonun içeriği ise şu şekilde;
 
{% csrf_token %} {{ form }}
Artık kullanabilirsiniz. Ekran çıktımız şu şekilde olacaktır.


noCAPTCHA
noCAPTCHA'nın reCAPTCHA'dan neredeyse hiç bir farkı yok. Hemen ufak tefek değişikliklerden bahsedelim. Github sayfasını sizinle paylaşalım. https://github.com/ImaginaryLandscape/django-nocaptcha-recaptcha Bu sayfada kullanımı oldukça basit bir şekilde anlatılmış.
İlk önce kurulum yapıyoruz.
pip install django-nocaptcha-recaptcha
Daha sonra aynı şekilde INSTALLED_APPS'e ekliyoruz.
INSTALLED_APPS = (
....
    'nocaptcha_recaptcha',
)
settings.py dosyasına ayarlamaları ekliyoruz.
NORECAPTCHA_SITE_KEY = 'Googledan aldığınız Site Key'
NORECAPTCHA_SECRET_KEY = 'Googledan aldığınız Secret Key'
Form dosyasını şu şekilde değiştiriyoruz.
from django import forms
from nocaptcha_recaptcha.fields import NoReCaptchaField

class reCAPTCHAForm(forms.Form):
    captcha = NoReCaptchaField()
View dosyamız
from django.shortcuts import render
from go.forms import reCAPTCHAForm
# Create your views here.
def go(request):
 if request.method == "POST":
     form = reCAPTCHAForm(request.POST)
     if form.is_valid():
                """ Doğru ise yapılacaklar """
 else:
     form = reCAPTCHAForm() 
 return render(request, 'index.html', locals())
index.html şablon dosyamız


 
{% csrf_token %} {{ form }}
Burada dikkat etmeniz gereken ekstrandan Google'ın javascript dosyasını çağırıyor olmamız.

9 Ocak 2015 Cuma

Django ile uygulama yaparken bazen model dosyalarınızda çoklu dil desteği oluşturmak isteyebilirsiniz. 3.parti uygulama olarak hvad bunun için müthiş bir kolaylık sağlıyor. Uygulamanın github sayfasına buradan veya kendi dökümantasyonuna buradan ulaşabilirsiniz.
Biz bu yazıda basit bir örnek yaparak model dosyamızı nasıl çoklu dil desteği verebiliriz ve bunu web sitesinde seçim olarak nasıl gösterebiliriz buna bakacağız. İlk olarak basit bir şekilde uygulamayı kuralım.
pip install django-hvad
Ardında uygulamayı projemize dahil edelim.
INSTALLED_APPS = (
    ....
    'hvad',
)
Şimdi uygulamayı kullanabiliriz. İlk önce yapmamız gereken model oluşturmak. Model oluştururken bildiğiniz gibi djangonun kendi model sınıflarından kalıtım alıyoruz. Burada ise yapmamız gereken hvad uygulamasının sınıflarından kalıtım almak. Basit bir model oluşturalım.
from hvad.models import TranslatableModel, TranslatedFields,
class Images(TranslatableModel):
    image = models.ImageField()
    category = models.ForeignKey(Category)

    translations = TranslatedFields(
        title=models.CharField(max_length=200),
        description=models.TextField(),
    )

Burada gördüğünüz gibi bir model oluşturduk. Burada image alanı sabit olduğu için translation içerisine almadık sonuç olarak resim her zaman aynı. Ama title ve description alanları her dil için farklı olarak girilmesi gerektiğinden dolayı TraslatedField alanı içerisin aldık. Şimdi bu model oluşturduğumuza göre admin.py dosyası içerisinde ayarlamalarını yapmalıyız. admin.py dosyası şu şekilde olmalı.
from *.models import Images
from hvad.admin import TranslatableAdmin

class ImagesAdmin(TranslatableAdmin):
    def __init__(self, *args, **kwargs):
        super(ImagesAdmin, self).__init__(*args, **kwargs)
Bunları yaptıktan sonra admin sayfasından ekleme yapmaya çalışırsanız şu şekilde bir pencere ile karşılacaksınız.
Gördüğünüz gibi hemen hemen her dil için ekleme yapabiliyoruz. Burada TranslatedField alanı içerisine almadıklarımızı bir kere girmemiz yeterli aldıklarımızı için her dil için farklı olarak girmeliyiz. Burada bazı dilleri istemeyebilirsiniz. Bunun için istediğiniz dilleri şu şekilde settings.py dosyasına ekleyebilirsiniz.
LANGUAGES = (
    ('tr', 'Turkish'),
    ('en', 'English'),
)
Artık sadece Türkçe ve İngilizce sekmelerini göreceksiniz. Bu şekilde iki dile indirmiş olduk. Peki ekleme yaptıktan sonra bunları view dosyaları içerisinde dillere göre nasıl alacağız. Buda oldukça basit.
images = Images.objects.language('en').all()
Bu şekilde sadece ingilizce yazılan kısımlar gelecektir. Eğer siz bir kayıt eklerken sadece türkçe kısmını girer ve ingilizce kısmını boş bırakırsanız bu sorguda o kayıt gelmeyecektir. Burada language kısmı içerisini session değerinden çekerek kullanıcının seçtiği dile göre veritabanından sorgulama yapabilirsiniz. Bu yazıda çok basit bir şekilde hvad uygulamasının kullanımından bahsettik. Gerçekten de insanın işini çok kolaylaştıran bir uygulama. Daha fazla bilgiye kendi dökümantasyonundan oulaşabilirsiniz.
Kaynakça