17 Haziran 2014 Salı

Modellerden Kullanıcı Oluşturma

Bu yazıda bir modelden kullanıcılar nasıl oluşturulur ondan bahsedeceğiz. Yani her Doktor aynı zamanda bir kullanıcı olmuş olacak. Bunun için Modeli yeniden tanımlamamız gerekiyor. Modeller konusunda söylemiştik; bir modele ait bir tablo sadece bir kere oluşturulur. Bu yüzden tabloyu yeniden oluşturacağız ve içindeki verileri kaybedeceğiz. Bu sebepten dolayı Django'da Modelleri tasarlamak çok önemli. Modelleri tasarlarken sonradan bir değişiklik olmaması için iyice düşünmemiz gerekiyor. İlk önce yonetim/models.py dosyasındaki Doktor modelini düzenleyeceğiz.
from django.contrib.auth.models import User
class Doktor(User):

 yas = models.IntegerField(blank=True,verbose_name="Yaşınız",validators=[
  MaxValueValidator(70),
  MinValueValidator(30)
  ]
 )


 telefon = models.CharField(max_length=50,blank=True,verbose_name="Telefon Numaranız")

 def __unicode__(self):
  return u'%s , %s ,%s' % (self.first_name,self.last_name,self.email)

 class Meta:
  ordering = ['first_name']
Doktor modeli önceden models.Model biçiminde bir nesne iken şimdi User biçiminde bir nesne oldu. Yani artık Doktor nesnesi User nesnesinin tüm özelliklerini kalıtım ile alacak. first_name,last_name,password,email,groups,user_permissions gibi User nesnesine ait tüm özellikler Doktor nesnesi içinde geçerli olacaktır. Bizde bu yüzden Doktor nesnesi içerisinde tanımlamış olduğumu adi,soyadi,eposta gibi alanları kaldırdık. Bu alanları artık User nesnesinden alıyoruz. Tabi Doktor nesnesi içerisinde kullandığımız adı,soyadı,email gibi alanları da first_name,lastname,email ile değiştirdiğimize dikkat edin. Modelimizi yeniden tasarladık. Şimdi bu yeni modele ait tabloyu tekrardan oluşturmamız gerekiyor. Bunun için ilk önce Python kabuğunu açarak var olan tabloyu silmeliyiz.
>>> import sqlite3
>>> from django.conf import settings
>>> vt = sqlite3.connect(settings.DATABASES['default']['NAME'])
>>> vt.execute('DROP TABLE yonetim_doktor')

>>> vt.commit()
>>> vt.close()
Tabloyu kaldırdığımıza göre yenisini oluşturabiliriz. Aşağıdaki komutu terminalde yazalım.
python manage.py syncdb
Artık diğer alanlarımızı da bu modele göre değiştirmemiz gerekiyor. İlk önce yonetim/forms.py dosyasında DoktorFormu'nu değiştireceğiz.
from django.contrib.auth.hashers import make_password
class DoktorFormu(ModelForm):

 sifre = forms.CharField(label="Şifre",
       help_text="Bir parola yazın",
       required=False)


 class Meta:
  model = Doktor
  fields = ('first_name','last_name','username','sifre','yas','telefon','email')

 def save(self,commit=True):
  instance = super(DoktorFormu,self).save(commit=False)
  if self.cleaned_data.get('sifre'):
   instance.password = make_password(self.cleaned_data['sifre'])
  if commit:
   instance.save()
  return instance


 def clean_telefon(self):
  tel = self.cleaned_data['telefon']
  if tel != "":
   if len(tel) != 11:
    raise forms.ValidationError('Telefon numarasi 11 karakter olmalidir.')
  return tel
Form içerisinde save() işlevini kendimiz tanımladık. Bunu kendimizin tanımlama sebebi; parolanın şifrelenerek veri tabanına kaydedilmesini sağlamaktır. Eğer bu şekilde yapmazsak şifreler girildiği gibi kaydedilir ve Django onaylama işlemini yapmayacaktır. Sıra geldi görünümleri düzenlemeye. yonetim/views.py dosyasındaki Doktor_listesi işlevi içerisindeki alanları değiştirmeliyiz. Sıralama kriterleri aşağıdaki gibi olmalıdır.
siralamaKriteleri = {
 '1':'first_name',
 '2':'last_name'
}
Doktorları veritabanından çekerken kullandığımız Q nesnesinin yeni hali şöyle olmalıdır.
doktorlar_tum = Doktor.objects.filter(
Q(first_name__contains=aranacak_kelime) | Q(last_name__contains=aranacak_kelime)
)
Ve son olarak da doktor_listesi.html şablonunda değişiklikler yapmalıyız.
doktor.adi => doktor.first_name
doktor.soyadi => doktor.last_name
doktor.eposta => doktor.email
Artık yeniden doktor ekleyebiliriz.
Ekleyeceğimiz her doktor bundan böyle aynı zamanda bir kullanıcı olacaktır. Tabi bu şekilde bir kullanımda doktorlara standart bir kullanıcı yetkisi de vermiş oluyoruz. Bu yüzden sayfalarımızı tasarlarken yetki meselesine çok dikkat etmemiz gerekiyor.
Kaynakça
  • Mustafa Başer - Django Kitabı

0 yorum :

Yorum Gönder