7 Temmuz 2014 Pazartesi

Kullanıcı Profili

Projemizde kullanıcılarımız bulunmaktadır. Fakat bu kullanıcıların herhangi bir profilleri yok. Bu bölümde bunu yapalım. Her kullanıcının bir profili olsun. Bu profilde resim,telefon,şehir gibi bilgilerini alalım. Django'da resim yani ImageField alanını kullanabilmek için PIL kütüphanesinin kurulu olması gereklidir. Bu kütüphanenin nasıl kurulacağını CAPTCHA Kullanımı yazısında anlatmıştık. Django'da yüklenecek dosyaların yüklenebilmesi için settings.py dosyasında MEDIA_ROOT değişkeninde yüklenecek yerin belirtilmesi gereklidir. Hatırlarsanız daha önceden statik dosyaları tuttuğumuz statik_dosyalar dizinimiz vardı. Resimleri de bu dizin içerisinde resimler adında oluşturacağımız bir dizinde saklayacağız. Bunun için hastahane/settings.py dosyasına şu satırı ekliyoruz.
MEDIA_ROOT = os.path.join(anadizin,'statik_dosyalar/resimler')
Django'da resimler yüklendikten sonra nesne üzerinde bir değişiklik olduğunda veya silindiğinde bulunduğu dizinde kalmaktadır. Bu da proje için gereksiz yük demektir. Ya bu şekilde kalan resimleri silme işlemini kendimiz yapacağız yada Django'nun bize sağlamış olduğu django-cleanup modülünü kullanacağız. İkinci yol daha mantıklı olduğu için biz de bu yolu seçeceğiz. django-cleanup modülünü http://github.com/un1t/django-cleanup adresinden indirebilirsiniz. İndirdiğiniz dosyayı açtıktan sonra bu dizine girerek şu komutu vermeniz gereklidir.
python setup.py install
Windows kullananlar için;
pythonunkuruluoldugudizin/python.exe setup.py install
şeklinde olacağını söylememize gerek yok sanırız. Modülü kurduğumuza göre artık projemize dahil edebiliriz. Bunun için hastahen/settings.py dosyasındaki INSTALLED_APPS değişkeninin her zaman en sonunda olacak şekilde şu satırı ekliyoruz.
'django_cleanup',
Artık kullanıcı profiline ait modeli tanımlayabiliriz. yonetim/models.py dosyasına yazıyoruz.
import os

def resim_patikasi_belirle(instance,dosyaadi):
    uzanti = os.path.splitext(dosyaadi)[-1]
    dosyanin_kayit_adi = os.path.join('profil_resimleri',str(instance.user.id)+uzanti)
    return dosyanin_kayit_adi

class KullaniciProfili(models.Model):
    user = models.OneToOneField(User,unique=True,related_name='KullaniciProfili')
    resim = models.ImageField(upload_to=resim_patikasi_belirle)
    sehir = models.CharField(max_length=30,blank=True)
    telefon = models.CharField(max_length=11,blank=True)
    okul = models.CharField(max_length=40,blank=True)
Modeldeki user satırında OneToOneField alanını kullandığımıza dikkat edin. Bu alan sayesinde bu modeldeki her veri bir kullanıcı ile ilişkili olacaktır. Profil modelinin hangi kullanıcılara uygulanacağını related_name özelliği ile belirtiyoruz. Eğer bir profilin tüm kullanıcılara uygulanmasını istiyorsanız related_name argümanı yerine,hastahane/settings.py dosyasına şu satırı ekleyebilirsiniz.
AUTH_PROFILE_MODULE = 'yonetim.KullaniciProfili'
Bu yöntemi kullanmıyoruz. Bizim kullandığımız yöntem sayesinde birden fazla kullanıcı profili oluşturabiliriz.
Dosya içerisinde resmin yükleneceği yeri belirleyen bir işlev tanımladık. Bu işlev iki iki parametre almaktadır. instance parametresi sayesinde yüklenen resmin hangi kullanıcı tarafından yüklendiğini öğrenebiliriz. instance.user nesnesi kullanıcı ile ilgili her bilgiyi barındırır. dosyaadi ise yüklenen dosyanın adıdır. Dosyanın adını alarak uzantısını elde etmiş oluyoruz. Burada işlev dosyanın kayıt edileceği yer + kullanıcı numarası + resim uzantısı şeklinde resmi geri döndürüyor. Yani 10 numaralı kullanıcı jpg türünden bir resim yüklediğinde statik_dosyalar/resimler/profil_resimleri/10.jpg şeklinde resim kayıt edilecektir.
Oluşturduğumuz modeli kullanarak formu oluşturalım. yonetim/forms.py dosyasına ekliyoruz.
from django.db.models.signals import post_save

class KullaniciProfiliFormu(forms.ModelForm):
    class Meta:
        model = KullaniciProfili
        exclude = ('user',)

def kullanici_profili_olustur(sender,instance,created,**kwargs):
    if created:
        KullaniciProfili.objects.create(user=instance)

post_save.connect(kullanici_profili_olustur,sender=User)
İlk önce KullaniciProfili modelini kullanarak formu oluşturduk. Buradaki kullanici_profili_olustur işlevi her kullanıcı için KullanıcıProfili tablosundan kullanıcı için bir satır oluşturacaktır. Buradaki form kaydedildiğinde post_save sinyali yayımlanır. Bu sinyali ise post_save.connect işlevi sayesinde yakalıyoruz. Bu işleve şunu diyoruz: Form kayıt sinyalini yakaladığın anda kullanici_profili_olustur() işlevini çağır. Bu işlev çağrılır ve kullanıcı için bir satır oluşturulur. Eğer bir kullanıcı bu şekilde oluşturulmamış ise profili oluşturulamayacaktır. Bunun kontrolünü görünüm içerisinde yapacağız.
yonetim/views.py dosyasına ekliyoruz.
def kullanici_profili(request):
    from models import KullaniciProfili
    if not KullaniciProfili.objects.filter(user=request.user.id):
        KullaniciProfili.objects.create(user=request.user)

    if request.method == "POST":
        form = KullaniciProfiliFormu(request.POST,request.FILES,instance=request.user.KullaniciProfili)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/yonetim/')
    else:
        form = KullaniciProfiliFormu(instance=request.user.KullaniciProfili)
    return render_to_response('kullanici_profili.html',locals(),context_instance=RequestContext(request))
Az önce görünüm içerisinde kontrolünü yapacağımızı söylemiştik. 2,3,4. satırlarda bu kontrolü yapıyoruz. Eğer kullanıcı bu şekilde oluşturulmamış ise KullaniciProfili tablosunda o kullanıcıya satır oluşturulamamış demektir. Biz de oluşturma işlemini burada yapıyoruz.
3.satır: Eğer kullanıcı için ZiyaretciProfili tablosunda satır oluşturulmamışsa
4.satır: Bu kullanıcıya satır oluştur.
Son olarak bu görünüm için şablonumuzu oluşturalım. /yonetim/sablonlar/kullanici_profili.html oluşturuyoruz ve ekliyoruz.
<!DOCTYPE html>
<html>
<head>
    <title>Kullanıcı Profili</title>
    <link rel="stylesheet" type="text/css" href="/dosyalar/style.css" />
</head>
<body>

<h1>Profilim</h1>


<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <table border="1">
        {{ form }}
    </table>
    <input type="submit" value="Profil Kayıt" />
</form>


</body>
</html>
Şablonu da oluşturduğumuza göre url tanımlamamızı yapabiliriz. hastahane/urls.py dosyasına ekliyoruz.
url(r'profil/profil_resimleri/(.*)','yonetim.views.profil_resimleri'),
Her şey tamam yapmamız gereken tek şey oluşturduğumuz model için tabloların oluşmasını sağlamak. Bunun için komut satırında şu komutu veriyoruz.
python manage.py syncdb
Daha önce oluşturduğumuz yonetim_giris.html şablonuna şu linki ekliyoruz.
<div><a href="/profil/"/>Profilim</div>
Şimdi sunucuyu yeniden başlatın ve bir kullanıcı ile giriş yaptıktan sonra. Eklediğimiz linke tıklayın veya tarayıcıdan http://localhost/profil adresine gidin.
Bu pencerenin boş hali ile karşılaşacaksınız. Kullanıcı için bu bilgileri doldurduğunu zaman ise bu pencere gelecek karşınıza. Dikkat ederseniz var olan resim için bir link verilmiş. Fakat bu link şu anda çalışmayacaktır. Çünkü bu link ile ilgili görünümü yazmadık. Şimdi onu yazalım.
yonetim/views.py dosyasına ekliyoruz.
from django.conf import settings
def profil_resimleri(request,resim_adi):
    dosya_yolu = os.path.join(settings.MEDIA_ROOT,'profil_resimleri',resim_adi)
    if os.path.join(dosya_yolu):
        resim = os.path.join(settings.MEDIA_ROOT,'profil_resimleri',resim_adi)
        uzanti = os.path.splitext(resim_adi)[-1][1:]
        mime_tipi='image/%s' % uzanti
        resim_bilgi = open(resim,"rb").read()
        return HttpResponse(resim_bilgi,mimetype=mime_tipi)
    else:
        resim_bilgi = open(os.path.join(settings.MEDIA_ROOT,'resim_yok.png'),"rb").read()
        return HttpResponse(resim_bilgi,mimetype='image/png')
Görünümde resim_adi ile tarayıcıdan gelen resmin adını alıyoruz. Ve bu resmin yolunu dosya_yolu değişkenine atıyoruz. Eğer bu resim var ise resmi yok ise de resim_yok.png'i kullanıcıya gösteriyoruz. Resmin görülebilmesi için url'li de ekleyelim. hastahane/urls.py dosyasına ekliyoruz.
url(r'profil/profil_resimleri/(.*)','yonetim.views.profil_resimleri'),
Artık linke tıklandığında resmin açılacağı bir sayfaya gidilecek. Son olarak kullanıcıya yönetim sayfasında kendi resmini gösterelim. Bunun için yonetim/sablonlar/yonetim_giris.html şablonuna şu satırı ekliyoruz.
<img src="/dosyalar/resimler/{{request.user.KullaniciProfili.resim.url}}" width="150" height="150"/>
Tarayıcıdan http://localhost:8000/yonetim/ yazdığınızda kullanıcı resmini de görebilirsiniz.
Kullanıcı profili oluşturmak bu kadar.
Kullanıcı profili oluşturabilmek için veri tabanında yeni bir tablo oluşturduk. Bu tabloyu yonetim sayfasına eklemediğimiz için Djando Yönetim Panelinde bu tabloyu göremeyeceksiniz. Görebilmek için yonetim/admin.py dosyasına şu satırı ekleyelim.
admin.site.register(KullaniciProfili)
Artık Yönetim Panelinden de kullanıcı profillerini yönetebiliriz. Tablonun daha anlaşılır olabilmesi için KullaniciProfili modeline şu satırları ekleyebilirsiniz.
    def __unicode__(self):
  return u'%s' % (self.user)
Yönetim Paneline Kullanıcı Profilleri alanı geldi.
Artık projemizdeki kullanıcılar profile sahip olmuş oldu.
Kaynakça

0 yorum :

Yorum Gönder