"Enter"a basıp içeriğe geçin

Django’da Kullanıcı Bilgilerini Genişletmek

Django’nun kendi içinde bulunan Users sınıfı bize temel kullanıcı bilgilerini yönetmemizde yardımcı oluyor. Kullanıcı bilgilerini genişletmek istersek ; kimlik bilgisi, doğum tarihi,vs gibi alanları eklemek istersek. Akla ilk gelen yöntem yeni bir model oluşturup bunu da OneToOneField alanı ile Users modeline bağlamak oluyor. Aslında bunun daha güzel bir çözümü mevcut bu yazımda kısaca değinmek istiyorum.

Yapacağımız işlem basit AbstractUser sınıfından kalıtım alarak yeni bir sınıf oluşturup gerekli ayarları yapmak.

Bu işlemleri yaparken migration işlemlerinde hatayla karşılaşma olasılığınız çok yüksek o yüzden yeni kullanıcı sınıf oluşturacaksanız projenin en başında bunu yapmanız da fayda var.

manager.py

from django.contrib.auth.base_user import BaseUserManager

class UserManager(BaseUserManager):
use_in_migrations = True

def _create_user(self, email, password, **extra_fields):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_staff', True)

if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')

return self._create_user(email, password, **extra_fields)

Kullanıcı login, createuser, createsuperuser gibi işlemleri kullanabilmek için kendime yeni bir manager sınıfı oluşturdum.[1]

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from .manager import UserManager
class UserProfile(AbstractUser):
"""
@description: Kullaninici
"""
email = models.EmailField('email address', unique=True)
full_name = models.CharField(max_length=120,null=False,default=None)
identity = models.IntegerField(null=True)
birthday= models.DateField(null=True)

objects = UserManager()

USERNAME_FIELD='email'
REQUIRED_FIELDS = ['full_name']

class Meta:
verbose_name=u'Kullanıcı'
verbose_name_plural=u'Kullanıcılar'

Kullanıcı girişlerinin  e-posta ile yapılmasını istediğimden email diye bir alan oluşturup bu alanı uniq olarak atadım ve bu alanı USERNAME_FIELD ile sınıfa tanıttım.REQUIRED_FIELDS alanı ile createuser,createsuperuser gibi yönetim işlemlerinde ihtiyacım olan ekstra zorunlu alanları tanımladım. Ben full_name,birthday ve identity alanlarını ekledim size isterseniz artırabilirsiniz.

Sınıfı kalıtım aldığımız için diğer alanların (date_joined,last_login) üzerine eklendi yani normalda bulunan alanları bir daha eklemenize gerek yok. [2]

admin.py

from .models import *
from django.contrib.auth.admin import UserAdmin
class CustomUserAdmin(UserAdmin):
model= UserProfile
list_display = ('email', 'full_name', 'is_staff','birthday','identity')
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('birthday','identity')}),
)
admin.site.register(UserProfile,CustomUserAdmin)

Admin panelinde kullanmak için UserAdmin sınıfını kalıtım alıp eklediğim yeni alanları fieldsets kısmında tanımladım. [1]

settings.py

AUTH_USER_MODEL = "uygulamaadı.UserProfile"

Son olarak settings.py ayar dosyasında oluşturduğum yeni kullanıcı sınıfımın her yerde kullanacağımı, kullanıcı işlemlerinde bu sınıfın baz alınmasını istediğimi tanımlamak için AUTH_USER_MODEL tanımını yaptım.

Bu yaptığımı işlemlerden sonra temel kullanıcı bilgilerimi genişletmek için başka ilişkili bir tabloya ihtiyacım olmayacak. UserProfile sınıfına yeni alan eklemek yeterli olacak. Başkalarına da faydası olması dileğiyle
[2] https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html

[1] https://simpleisbetterthancomplex.com/tutorial/2016/11/23/how-to-add-user-profile-to-django-admin.html

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir