Skip to content

User Modelini Genişletmek

User Modelini Genişletmek

Merhaba arkadaşlar bildiğiniz gibi django da belirli özelliklere sahip bir user modelimiz var bu model’de isim,soy isim,email,şifre vb bilgiler mevcut bu bilgiler çoğu zaman hayat kurtarsada bazı durumlarda yeterli olmuyor ve bizlerin yapmakta olduğu projeye göre kullanıcların daha fazla özelliklere sahip olması gerekiyor işte burda yapmak istediğimiz olayı kullanıcı modelini genişleterek elde edeceğiz bu olayada genişletme \( extend \) deniyor hadi başlayalım

Nedir ?

Django da varsayılan olarak gelen user modeline yeni özellikler eklenmesine genişletme diyoruz.

Nasıl Genişler bu User Modeli

Aslında genişletmemizi sağlıyan 4 tane seçenek var elimizde kısaca onların ne olduğuna değinip bu gün anlatacağımız olaya geçelim.

  • Proxy modelini kullanarak yapılan

Veri tabanı içinde yeni bir tablo oluşturmadan modeli miras alarak yapılan olaya proxy model deniyor,mevcut bir veritabanı şemasını etkilemeden mevcut bir modelin davranışını değiştirmek için kullanılır.

  • Kullanıcı modeli ile One-To-One bağlantısı kurarak

Çalışma prensibi şu,kendi veri tablosuna sahiptir ve farklı bir model aracılığı ile bire bir \( one-to-one \) bağlıdır.

örnek vermek gerekirse user modeli içindeki user id ‘sini alıp yeni oluşturduğumuz tabloya user_id olarak ekliyor ve yeni oluşan tabloya bu id altında bilgiler ekleniyor mesela user_id ‘si 4 olan kullanıcının telefon numarası adlı tablosuna gelen veriyi ekler ve biz veriyi çekmek istersek önce user_id den değeri alır ve bu değer User modelinde hangi kullanıcıya denk geldiğini bulur işlem bu şekilde devam eder.

  • AbstractBaseUser’yi Genişleten Özel Bir User model oluşturarak

AbstractBaseUser’dan devralınan tamamen yeni bir User modelidir, settings.py den bir kaç değişiklik yapmayı gerektirir ve bu projenin başında yapılmalıdır, çünkü veritabanı şemasını önemli ölçüde etkileyecektir hatalar içinde can vermemek için projeye başlamadan önce yapılması tavsiye edilir .

  • AbstractUser ‘ı genişleterek yeni bir özel User modeli yapmak

Hemen bir üste söylediğim şeyler bunun içide geçerli o yüzden hemen geçiyorum dikkat ! Peki sen hangisini anlatacaksın ?

Kolay ve hemen kavranabilen one-to-one olayını anlatacağım. Önce projenize eklemediyseniz models.py içine şu User modeli’ni dahil edelim

from django.contrib.auth.models import User

Bu django’nun bize hazır olarak verdiği user modelidir ve şimdi biz bu user modeline eklenmesi gereken diğer kullanıcı bilgilerini projenize göre şekillendirin ve eklemeler yapın.

class UserProfile(models.Model): # kullanıcıların diğer bilgileri
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    pp = models.BooleanField(default = False,verbose_name = "profil resmi")
    is_author = models.BooleanField(default = True, verbose_name = "yazar olarak kabul et")
    author = models.BooleanField(default = True, verbose_name = "yazarlık başvurusu")
    about = RichTextField(null = True, blank = True,verbose_name = "kişi hakkında")
    following = models.IntegerField(default = 0)
    followers = models.IntegerField(default = 0)
    hmanycontent = models.IntegerField(default = 0)

Şimdi bu yaptığımız OtherInfo modelimizi anlatalım.

  • user = models.OneToOneField olarak yazdığınız yerde modelimizdeki user \( kullanıcı \) yı django’nun kendi modeline bağladık bu bağlamadan sonra veri tabanında UserProfile tablosunda user bölümünde ilgili kullanıcının id numarası olacaktır, direk kullanıcı adı falan olmayacaktır.
  • models.CASCADE ifadesi bağlı olan nesne silinirse bu da silinsin anlamı taşımaktadır yani django’ya bunu bildirmemizi sağlar.

Diğer ifadeler ise benim projeme göre gerek duydugum ifadelerdir pp - profil resmi yüklemişmi followers - kaç kişi takip ediyor following - kaç kişi takip ediliyor gibi bilgiler

kısacası veri tabanı şu şekilde görünecektir işlem sonrası.

id user_id pp
0 3 1
1 4 0
2 5 0

Admin Tarafı

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
#daha sonra kullanarak genişletmiş olduğumuz modelimizi dahil edelim benim ki şöyle ;
from models import UserProfile

class UserProfileAdmin(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = "Kullanıcının diğer bilgileri"

#**verbose_name_plural** ile de admin saydasında gösterilecek olan ismi yazıyorsunuz.
#**model** ile hangi model sınıfımız kullanılacak onu belirtiyoruz

#Ve yeni modelimizi dahil etmek için şunu yazıyoruz

class UserAdmin(UserAdmin):
    inlines = (UserProfileAdmin, )
    """buraya az önce admin.py de oluşturduğumuz
    sınıf ı yazıyoruz virgülü unutmayın hata verir"""

eğer birden fazla genişletme yaparsanız yine class UserProfileAdmin\(admin.StackedInline\): bunun gibi tanımlayıp gereken yeri dolduruyorsunuz ve class UserAdmin\(UserAdmin\): burada inlines içine sınıfınızı yazıp sonuna virgül koyuyorsunuz.

sonra klasik user modelini unutsun onun la işlem yapmasın diye django’ya şu şekilde bildiriyorum.

admin.site.unregister(User)

buraya tekrar varsayılan olarak gelen User modelini atıyoruz. ve son olarak yeni özellikleri gönderip arkamıza yaslanıyoruz

admin.site.register(User, UserAdmin)

Son olarak models.py de değişikliler yaptığımız için veritabanına yansıtılması adına gerekli olan

python manage.py migrate
python manage.py makemigrations myapp # (myapp burda sizin oluşturduğunuz uygulama adı oluyor mesela benimki cooggerapp )

komutlarını çalıştırıp veritabanına işledikten sonra herşeyiniz hazır demektir

Template İçinde Kullanımı ?

Genişletme olayının benim en sevdiğim yanı ise eklemiş olduğumuz yeni özellikleri templatimizde hemen kullanabiliyor olmamız hiç bir başka işlem yapmadan views ile uğraşmadan hemen bir kaç örnek vererek konuyu bitirelim. mesela siz kullanıcın fotograf yüklemişmi yüklememişmi teplate içinde öğrenmeniz gerek o zaman benim modelim ile şu şekilde yapmanız gerek template

  {% if request.user.userprofile.pp %}
      <img  src="/media/users/{{ request.user  }}.jpg">
  {% else %}
      <img src="/static/media/profil.png" >
  {% endif %}

Burada tema içinde request.user.userprofile.pp bu kod ile gelen kullanıcının yani request.user ın profil yüklemişmi yüklememişmi ona baktık eğer True ise kendi resmini gösterdik False ise klasik resmi gösterdik

takip   {{ request.user.userprofile.following }}
takipçi  {{ request.user.userprofile.followers }}
Signals

User modelinizi genişlettiniz ve şimdi yeni bir kullanıcı, kayıt olduğunda bunu yakalamak ve açtığınız yeni model’e de kayıt olsun istiyorsunuz, o zaman Django signal konusunu öğrenmeniz gerekiyor.

Django Sinyalleri Nasıl Oluşturulur \( Django Signals \)


Last update: January 1, 2022
Created: January 1, 2022