Sitemap

Django Varsayılan User Modelini Değiştirmek

6 min readDec 7, 2018

Son zamanlarda fark ettiğim kadarı ile Django hakkında Türkçe sayılı makale bulunmakta; özellikle de Django’nun temellerinden sonra kapsamlı türkçe bir makale araştırmalarımda hiç göremedim, bu nedenle Django’nun hazır User modelinin nasıl değiştirilmesi gerektiğini anlatan ve herhangi bir projede muhtemelen yapmanız gerekecek olan işlemleri anlatan bu yazıyı kaleme alıyorum. Neden hazır kullanıcı modelini değiştirmeliyiz sorusuna güncel örnekler vermek gerekirse:

  1. Django User modelinde giriş işlemi kullanıcı adı(username) ile yapılmakta; ancak projelerimizde email ile giriş yapmak isteyebiliriz.
  2. Django User modelinde ad ve soyad ayrı olarak bulunmakta; ancak biz kullanıcı ismini tam isim olarak tutmak isteyebiliriz.

Umarım ileride böyle güzel bir framework için kapsamlı makaleler yazılır.

Ben bu projemde Python 3.6 ve Django 2.1 ile çalışacağım. Hadi başlayalım.

## Terminal veya cmd üzerinden Django ve Python yüklendikten sonra 
## yeni bir proje oluşturalım.
$ django-admin startproject usermodeldegistir$ python manage.py startapp users$ python manage.py runserver

Yukarıdaki şekilde usermodeldegistir isimli bir Django projesi oluşturduk; bunun akabinde proje içerisinde users isimli bir uygulama oluşturduk ve bundan sonra da ‘runserver’ komutumuz ile projemizi bilgisayarımızdaki lokal geliştirme serverında ayağa kaldırdık.

localhost:8000 veya 127.0.0.1:8000 üzerinden Django projemizin ayağa kalktığını görebilirsiniz.

Press enter or click to view image in full size

Öncelikle users uygulamamızı; Django içerisindeki settings.py dosyasının içerisindeki INSTALLED_APPS listesinin içerisine tanımlamamız gerekiyor:

INSTALLED_APPS = [     'django.contrib.admin',     'django.contrib.auth',     'django.contrib.contenttypes',     'django.contrib.sessions',     'django.contrib.messages',     'django.contrib.staticfiles',     'users.apps.UsersConfig',]

Daha sonra yine settings.py dosyasının içerisinde; oluşturacağımız yeni kullanıcı modelimizin yetkilendirme işlemlerinde kullanılacağını Django’ya aşağıdaki şekilde söylememiz gerekiyor.

AUTH_USER_MODEL = 'users.DegisikUser' ## İleride yeni modelimizi DegisikUser olarak tanımlayacağız.

Bu örneğimizde AbstractUser kullanarak kullanıcı modelimizi değiştireceğiz. Talep olursa AbstractBaseUser ile veya yeni model oluşturup OneToOne veritabanı ilişkisi ile de bu işlemlerin nasıl yapılacağını gösterebilirim.

Şimdi # users/models.py dosyamızın içerisine gelelim:

from django.db import modelsfrom django.contrib.auth.models import AbstractUserclass DegisikUser(AbstractUser):     YeniField = models.CharField(max_length = 255)     
def __str__(self):
return self.mail

Yukarıdaki şekilde varsayılan olarak gelen User modelimize YeniField isimli veritabanında- bir alan ekledik. Birazdan bunu veritabanına yazdırmak için migrate ( Burada migrate’i Türkçe olarak nasıl ifade edebilirim diye düşündüm ancak tam karşılığını bulamadım; birazdan bu işlemlerin ne olduğunu örnek üzerinden daha iyi anlayacağınızı düşünüyorum.) işlemlerini gerçekleştireceğiz.

Şimdi localhost’umuzu terminal’de CTRL + C veya COMMAND + C ile durduralım ve users uygulamamızın içerisine Django’nun bize sunduğu hazır kullanıcı giriş ve kullanıcı bilgileri update formlarını eklemek için users klasörümüzün içerisine forms.py isimli bir dosya oluşturalım.

# users/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import DegisikUser

class DegisikUserCreationForm(UserCreationForm):

class Meta(UserCreationForm):
model = DegisikUser
fields = ('username', 'email', 'YeniField')

class DegisikUserChangeForm(UserChangeForm):

class Meta:
model = DegisikUser
fields = ('username', 'email', 'YeniField')

Yukarıdaki forms.py dosyasında CustomUserCreation form isimli sınıfımız UserCreationForm isimli Django’nun içerisinde barındırdığı hazır kullanıcı oluşturma form sınıfından miras aldı ve içerisinde model olarak biraz önce oluşturduğumuz DegisikUser modelimizi bulunduracağını ve bu formda alanlar olarak ‘username’, ‘email’ ve kendi oluşturduğumuz ‘YeniField’ alanlarımızın bulunacağını söyledik. ‘username’ ve ‘email’ alanlarımız AbstractUser kullandığımız için Django’nun hazır User model yapısından geliyor.

Makalenin konusu Django Form yapısı olmadığı için bu kısımları detaylandırmadan geçiyorum.

Daha sonraki bir makalede ayrıca AbstractBaseUser yapısını kullanarak daha geniş kapsamlı ve daha çok özelliğe kendimizin müdahale edebileceği bir User modeli oluşturduğumuzda; buradaki her şeyi kendimiz değiştirebileceğiz.

Şimdi bu değişikliklerimizin Django’nun bize sunduğu admin sayfasında da görülmesi için gerekli işlemleri yapalım.

# users/admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

from .forms import DegisikUserCreationForm, DegisikUserChangeForm
from .models import DegisikUser

class DegisikUserAdmin(UserAdmin):
add_form = DegisikUserCreationForm
form = DegisikUserChangeForm
model = DegisikUser
list_display = ['email', 'username', 'YeniField']

admin.site.register(DegisikUser, DegisikUserAdmin)

Şimdi Django’nun bize sunduğu ORM modelimizi ayağa kaldırmak için ilk migration’umuzu yapalım. Yapacağımız migration ile birlikte; Django’da hazır olarak bulunan Sqlite3 veritabanı üzerinde Django bizim için gerekli kullanıcı modelimizde tanıdığımız alanları içeren tabloları ve diğer gerekli tabloları oluşturacak. Bu kısımların da detayına makalenin konusu olmadığı için girmiyorum.

$ python manage.py makemigrations users
$ python manage.py migrate

Yukarıdai komutumuz sonucunda; Django dosyaları arasında bulunan db.sqlite3 isimli dosyamızı DB Sqlite isimli program ile açtığınızda gerekli tablolarımızın oluşmuş olduğunu görebilirsiniz.

Aşağıdaki linkten DB Browser For SQLite programını kendi işletim sisteminize uygun formatta indirebilirsiniz.

https://sqlitebrowser.org/

Şimdi bir de admin olarak giriş yapıp sitemizi yönetmek için bir admin hesabı oluşturalım.

$ python manage.py createsuperuser

Yukarıdaki komutu çalıştırdıktan sonra Django’nun sizden istediği kullanıcı adı, şifre ve email kısımlarını doldurun ve admin kullanıcınızı oluşturun.

Basit Ana Sayfa, Kullanıcı Giriş Sayfası ve Çıkış Sayfalarını Oluşturalım

Şimdi Django’nun proje yolundaki templates klasörünü oluşturduğumuzda, tüm bu HTML sayfalarının buluınması için gerekli düzenlemeleri settings.py dosyasında yapalım.

TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]

settings.py içerisinde TEMPLATES ayarlarımızda directories(DIRS) içerisinde BASE_DIR içerisindeki ‘templates’ klasöründen html dosyalarımızı arayacağını söylüyoruz.

Yine settings.py içerisinde giriş(login) yaptıktan veya çıkış(logout) sonra Django’nun kullanıcıyı hangi sayfaya yönlendirmesi gerektiğini aşağıdaki şekilde tanımlıyoruz.

LOGIN_REDIRECT_URL = 'anasayfa'
LOGOUT_REDIRECT_URL = 'anasayfa'

Şimdi ana proje dizinimizde ‘templates’ isimli Django’nun HTML’lerimize bakacağı bir klasör daha oluşturuyoruz.

$ mkdir 'templates'
$ touch 'templates/girisyap.html'
$ touch 'templates/base.html'
$ touch 'templates/anasayfa.html'
$ touch 'templates/kayitol.html'

Şimdi bu yukarıda oluşturduğumuz HTML dosyalarımızın içerisinde ilgili formlarımızı oluşturmak için aşağıdaki şekilde dolduralım.

templates/base.html

<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{% block title%}Django User Model Değiştirme{% endblock %}</title>
</head>
<body>
<main>
{% block content %}
{% endblock %}
</main>
</body>
</html>

templates/anasayfa.html

<!-- templates/anasayfa.html -->
{% extends 'base.html' %}

{% block title %}Ana Sayfa{% endblock %}

{% block content %}
{% if user.is_authenticated %}
Hi {{ user.username }}!
<p><a href="{% url 'cikisyap' %}">Çıkış Yap</a></p>
{% else %}
<p>Giriş Yapmadınız</p>
<a href="{% url 'girisyap' %}">Giriş Yap</a> |
<a href="{% url 'kayitol' %}">Kayıt Ol</a>
{% endif %}
{% endblock %}

templates/girisyap.html

<!-- templates/girisyap.html -->
{% extends 'base.html' %}

{% block title %}Giriş{% endblock %}

{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Giriş Yap</button>
</form>
{% endblock %}

templates/kayitol.html

<!-- templates/kayitol.html -->
{% extends 'base.html' %}

{% block title %}Kayit Ol{% endblock %}

{% block content %}
<h2>Kayit Ol</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Kayıt Ol</button>
</form>
{% endblock %}

Şimdi ana proje dizinimizdeki urls.py dosyamızın içerisinde ilgili URL linklerimizi tanımlayalım.

from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView

urlpatterns = [
path('', TemplateView.as_view(template_name='anasayfa.html'), name='anasayfa'),
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('users/', include('django.contrib.auth.urls')),
]

Şimdi users dosyamızın içerisinde bir urls.py dosyası daha oluşturalım.

$ touch users/urls.py

users klasörümüz içerisindeki urls.py dosyamızı da aşağıdaki şekilde dolduralım. ( Konu dışı olduğu için url ve template içerisindeki Django komutları ile alakalı detaylara fazla girmiyorum. )

# users/urls.py
from django.urls import path
from . import views

urlpatterns = [
path('kayitol/', views.SignUp.as_view(), name='kayitol'),
]

Şimdi users uygulamamızın içerisindeki views.py dosyamızın içerisinde giriş formumuzu oluşturacak fonksiyonumuzu yazalım.

# users/views.py
from django.urls import reverse_lazy
from django.views import generic

from .forms import DegisikUserCreationForm

class SignUp(generic.CreateView):
form_class = DegisikUserCreationForm
success_url = reverse_lazy('login')
template_name = 'kayitol.html'

Kodlarımız hazır. Şimdi geliştirme sunucumuzu tekrar ayağa kaldıralım.

$ python manage.py runserver

İşlemlerimizin sonunda ilgili URL linkleri karşılığında aşağıdaki sayfaları alacaksınız.

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
django

--

--

No responses yet