coogger
Login via github
0
0 0
0
48

Gereksiz Metinler Silindi Ve Model Ismi DeğiştirildiStatus; Approved

@hakancelik96 committed 4 months
/@hakancelik96/user-modelini-genisletmek/
n1#### Neler öğreneceğim ?n
2 
3- genişletme nedir onu öğreneceğiz
4- one-to-one yapısını
5- diğer genişletme olaylarını
6- eklediğimiz diğer kullanıcı bilgilerini template içinde kullanımını
7 
8#### Gereksinimler
9 
10- Python3
11- Django 1.11 or Django 2
12 
13------------
14 
15Merhaba 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ım1Merhaba 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
162
17### Nedir ?3### Nedir ?
184
19Django da varsayılan olarak gelen user modeline yeni özellikler eklenmesine genişletme diyoruz.5Django da varsayılan olarak gelen user modeline yeni özellikler eklenmesine genişletme diyoruz.
206
n21### Nasıl genişler bu User modeli n7### Nasıl Genişler bu User Modeli
228
23Aslı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.9Aslı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.
2410
25-  Proxy modelini kullanarak yapılan11-  Proxy modelini kullanarak yapılan
2612
27> 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.13> 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.
2814
29  -  Kullanıcı modeli ile One-To-One bağlantısı kurarak15  -  Kullanıcı modeli ile One-To-One bağlantısı kurarak
3016
31> Çalışma prensibi şu,kendi veri tablosuna sahiptir ve farklı bir model aracılığı ile  bire bir ( one-to-one ) bağlıdır.17> Çalışma prensibi şu,kendi veri tablosuna sahiptir ve farklı bir model aracılığı ile  bire bir ( one-to-one ) bağlıdır.
3218
33ö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.19ö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.
3420
35- AbstractBaseUser'yi Genişleten Özel Bir User model oluşturarak21- AbstractBaseUser'yi Genişleten Özel Bir User model oluşturarak
3622
37> 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 .23> 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 .
3824
39-   AbstractUser 'ı genişleterek yeni bir özel User modeli yapmak25-   AbstractUser 'ı genişleterek yeni bir özel User modeli yapmak
4026
41> Hemen bir üste söylediğim şeyler bunun içide geçerli o yüzden hemen geçiyorum dikkat !27> Hemen bir üste söylediğim şeyler bunun içide geçerli o yüzden hemen geçiyorum dikkat !
42Peki sen hangisini anlatacaksın ?28Peki sen hangisini anlatacaksın ?
4329
44Kolay ve hemen kavranabilen one-to-one olayını anlatacağım.30Kolay ve hemen kavranabilen one-to-one olayını anlatacağım.
45[coogger](www.coogger.com)'ın kodlarını kullanarak açıklayacağım 31[coogger](www.coogger.com)'ın kodlarını kullanarak açıklayacağım 
46önce projenize eklemediyseniz **models.py** içine şu User modeli'ni dahil edelim32önce projenize eklemediyseniz **models.py** içine şu User modeli'ni dahil edelim
4733
48```python34```python
49from django.contrib.auth.models import User35from django.contrib.auth.models import User
50```36```
51Bu 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.37Bu 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.
5238
53```python39```python
n54class OtherInfo(models.Model): # kullanıcıların diğer bilgilerin40class UserProfile(models.Model): # kullanıcıların diğer bilgileri
55    user = models.OneToOneField(User, on_delete=models.CASCADE) 41    user = models.OneToOneField(User, on_delete=models.CASCADE) 
56    pp = models.BooleanField(default = False,verbose_name = "profil resmi")42    pp = models.BooleanField(default = False,verbose_name = "profil resmi")
57    is_author = models.BooleanField(default = True, verbose_name = "yazar olarak kabul et") 43    is_author = models.BooleanField(default = True, verbose_name = "yazar olarak kabul et") 
58    author = models.BooleanField(default = True, verbose_name = "yazarlık başvurusu")44    author = models.BooleanField(default = True, verbose_name = "yazarlık başvurusu")
59    about = RichTextField(null = True, blank = True,verbose_name = "kişi hakkında")45    about = RichTextField(null = True, blank = True,verbose_name = "kişi hakkında")
60    following = models.IntegerField(default = 0)46    following = models.IntegerField(default = 0)
61    followers = models.IntegerField(default = 0)47    followers = models.IntegerField(default = 0)
62    hmanycontent = models.IntegerField(default = 0)48    hmanycontent = models.IntegerField(default = 0)
63```49```
64Şimdi bu yaptığımız OtherInfo modelimizi anlatalım.50Şimdi bu yaptığımız OtherInfo modelimizi anlatalım.
6551
n66- user = models.OneToOneField olarak yazdığıız yerde modelimizdeki user ( kullanıcı ) yı django'nun kendi modeline bağladık bu bağlamadan sonra veri tabanında OtherInfo tablosunda user bölümünde ilgili kullanıcının id numarası olacaktır, direk kullanıcı adı falan olmayacaktır.n52- 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.
67- models.CASCADE ifadesi bağlı olan nesne silinirse bu da silinsin anlamı taşımaktadır yani django'ya bunu bildirmemizi sağlar.53- models.CASCADE ifadesi bağlı olan nesne silinirse bu da silinsin anlamı taşımaktadır yani django'ya bunu bildirmemizi sağlar.
6854
n69Diğer ifadeler ise benim projeme göre gerek duydugum ifadelerdir n55Diğer ifadeler ise benim projeme göre gerek duydugum ifadelerdir
70pp - profil resmi yüklemişmi56pp - profil resmi yüklemişmi
71followers - kaç kişi takip ediyor57followers - kaç kişi takip ediyor
72following - kaç kişi takip ediliyor gibi bilgiler58following - kaç kişi takip ediliyor gibi bilgiler
7359
74kısacası veri tabanı şu şekilde görünecektir işlem sonrası.60kısacası veri tabanı şu şekilde görünecektir işlem sonrası.
7561
76-------------------------------62-------------------------------
77|   id  |user_id |    pp   |63|   id  |user_id |    pp   |
78|------------------------------64|------------------------------
79|   0   |   3            |1|65|   0   |   3            |1|
80|   1   |   4            |0|66|   1   |   4            |0|
81|   2   |   5            |0|67|   2   |   5            |0|
8268
8369
84## **admin.py**70## **admin.py**
85```python 71```python 
86from django.contrib import admin72from django.contrib import admin
87from django.contrib.auth.admin import UserAdmin73from django.contrib.auth.admin import UserAdmin
88#daha sonra kullanarak genişletmiş olduğumuz modelimizi dahil edelim benim ki şöyle ;74#daha sonra kullanarak genişletmiş olduğumuz modelimizi dahil edelim benim ki şöyle ;
n89from models import OtherInfon75from models import UserProfile
9076
n91class OtherInfoAdmin(admin.StackedInline):n77class UserProfileAdmin(admin.StackedInline):
92    model = OtherInfo78    model = UserProfile
93    can_delete = False79    can_delete = False
94    verbose_name_plural = "Kullanıcının diğer bilgileri"80    verbose_name_plural = "Kullanıcının diğer bilgileri"
9581
96#**verbose_name_plural** ile de admin saydasında gösterilecek olan ismi yazıyorsunuz.82#**verbose_name_plural** ile de admin saydasında gösterilecek olan ismi yazıyorsunuz.
97#**model** ile hangi model sınıfımız kullanılacak onu belirtiyoruz83#**model** ile hangi model sınıfımız kullanılacak onu belirtiyoruz
9884
99#Ve yeni modelimizi dahil etmek için şunu yazıyoruz85#Ve yeni modelimizi dahil etmek için şunu yazıyoruz
10086
101class UserAdmin(UserAdmin):87class UserAdmin(UserAdmin):
n102    inlines = (OtherInfoAdmin, )n88    inlines = (UserProfileAdmin, )
103    """buraya az önce admin.py de oluşturduğumuz 89    """buraya az önce admin.py de oluşturduğumuz 
104    sınıf ı yazıyoruz virgülü unutmayın hata verir"""90    sınıf ı yazıyoruz virgülü unutmayın hata verir"""
105```91```
n106eğer birden fazla genişletme yaparsanız yine **class OtherInfoAdmin(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.n92eğ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.
10793
108sonra klasik user modelini unutsun onun la işlem yapmasın diye django'ya şu şekilde bildiriyorum.94sonra klasik user modelini unutsun onun la işlem yapmasın diye django'ya şu şekilde bildiriyorum.
109```python95```python
110admin.site.unregister(User)96admin.site.unregister(User)
111```97```
112buraya tekrar varsayılan olarak gelen User modelini atıyoruz.98buraya tekrar varsayılan olarak gelen User modelini atıyoruz.
113ve son olarak yeni özellikleri gönderip arkamıza yaslanıyoruz99ve son olarak yeni özellikleri gönderip arkamıza yaslanıyoruz
114```python100```python
115admin.site.register(User, UserAdmin)101admin.site.register(User, UserAdmin)
116```102```
117103
118Son olarak models.py de değişikliler yaptığımız için veritabanına yansıtılması adına gerekli olan104Son olarak models.py de değişikliler yaptığımız için veritabanına yansıtılması adına gerekli olan
119```python105```python
120python manage.py migrate106python manage.py migrate
121python manage.py makemigrations myapp # (myapp burda sizin oluşturduğunuz uygulama adı oluyor mesela benimki cooggerapp )107python manage.py makemigrations myapp # (myapp burda sizin oluşturduğunuz uygulama adı oluyor mesela benimki cooggerapp )
122```108```
123109
124komutlarını çalıştırıp veritabanına işledikten sonra herşeyiniz hazır demektir110komutlarını çalıştırıp veritabanına işledikten sonra herşeyiniz hazır demektir
125111
126### template içinde kullanımı ?112### template içinde kullanımı ?
127Geniş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.113Geniş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.
128mesela 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 gerek114mesela 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
129**template**115**template**
130```html116```html
n131  {% if request.user.otherinfo.pp %}n117  {% if request.user.userprofile.pp %}
132      <img  src="/media/users/{{ request.user  }}.jpg">118      <img  src="/media/users/{{ request.user  }}.jpg">
133      {% else %}119      {% else %}
134      <img src="/static/media/profil.png" >120      <img src="/static/media/profil.png" >
135      {% endif %}121      {% endif %}
136```122```
n137Burada tema içinde **request.user.otherinfo.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österdikn123Burada 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
138```html124```html
t139takip   {{ request.user.otherinfo.following }}t125takip   {{ request.user.userprofile.following }}
140takipçi  {{ request.user.otherinfo.followers }}126takipçi  {{ request.user.userprofile.followers }}
141```127```
142bu şekildede sonuca ulaşabilirsiniz128bu şekildede sonuca ulaşabilirsiniz
143iyi çalışmalar.129iyi çalışmalar.
144130
145## sonuç 131## sonuç 
146![extend-user-model](https://www.coogger.com/media/images/extend-user-model.png)132![extend-user-model](https://www.coogger.com/media/images/extend-user-model.png)
Please login to make a comment