PYTHON-DJANGO-BLOG PROJE ÇALIŞMASI 8 (Uygulamamızda Kullanıcı profili ve resmi ekleme işlemleri)

 Bir önceki yazımızda kullanıcı  ilgili users modelimizi oluşturmuştuk. Şimdi o modele alanlar(fields) ekleyeceğiz. Bu işlemler için aşağıdaki sırayı takip edin.

1. users app altında models.py dosyasını açın:

( Bir kullanıcı(user) bir profil ile yine bir profil bir user ile ilişkili olması beklenir.) 

users app -models.py:

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg', upload_to='profil_resmi')

def __str__(self):
return f'{self.user.username} Profile'

Bir kullanıcı silindiğinde onunla ilişkili olan profilin de silinebilmesi için on_delete=models.CASCADE komutu eklendiğini görüyoruz.

Burada yine bir dunder metod kullanıldı.( Profile isimli sınıfın bu metoda vereceği cevabı anlatır. Yani bu metod sınıftan user a bağlı username cevabını alır bekler)

ImageField isimli satır da profil resmi ile ilgili kodların eklendiği yerdir. Burada profil_resmi isimli bir klasör migrate işlemlerinden sonra dizininize otomatik eklenecek. ( profil_resmi klasörünün nereye konumlanacağı ve diğer tüm buna benzer medya klasörlerinin nereye yerleşeceği sorularının cevabı aşağıda 4.madde de açıklandı.)

2. Şimdi oluşturduğumuz modelin database de yerini alması gerekir. Bunun için TERMİNALE geçiş yapıp, makemigrations-migrate işlemleri yapmak gerekir.

a. ilk komut( makemigrations) uygulanır:

>>> py manage.py makemigrations ENTER a basılır.


NOT: Bu işlemi yaparken şöyle bir uyarı gelir:

ERRORS:

users.Profile.image: (fields.E210) Cannot use ImageField because Pillow is not installed.

        HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "python -m pip install Pillow".

Bu hata bize ImageField ı kullanabilmek için Pillow kütüphanesini kurmanızı ister. Bunun için yine TERMİNALE  aşağıdaki komutu girin:

>>>pip install Pillow yazıp ENTER a basın. ( internetiniz varsa Başarılı bir yükleme yapacaktır.)

Şimdi tekrar makemigrations komutu uygulayın.

>>> py manage.py makemigrations ENTER a basılır.( Artık hatasız bir işlem yapılmış olur.)

b. migrate komutu uygulanır.(TERMİNAL e geçip aşağdakki komut yazılır.)

>>> py manage.py migrate 


3. users app - admin.py dosyasına geçip profil ayarlarının admin sayfasında da görünür olması için ayarlamalara devam edelim. 

users app - admin.py dosyasını açıp kodu girin:

from django.contrib import admin
from .models import Profile

# Register your models here.
admin.site.register(Profile)

projenizi RUN yapıp admin sayfasına geçiş yaptığınızda profil tanımlamalarına admin sayfasından ulaşıldığını göreceksiniz. Burada kullanıcıara profil eklemsi ve prpfil resmi ekleyebilirsiniz.

4. Şimdi profil resimlerimizin profil_resmi isimli klasöre ekleneceğiniz yukarıda belirtmiştik. Peki bu klasör nereye oluşturuyoruz? Bu klasörü de anaproje kısmına yeni klasör ekleyin ismine media olarak belirleyin ve için bir klasör daha ekleyin adını da profil_resmi olarak belirleyin. Bu şekilde yüklenecek profil resmi gibi yüklemelerin tek bir klasörden-merkezden ulaşılması daha kullanışlı olurdu bu ana klasörümüzü setting py e tanıtalım adını da media belirleyelim.

setting.py dosyasını açın en alta inin aşağıdaki kodu ekleyin:
(NOT: Aşağıdaki kodda ilk satırdaki media ismi yerine istediğiniz adı kullanabilirsiniz ancak 2.satırdaki yer ise django tarafından sabit kullanılır. Bir aşağıdaki kodu yazarken setting.py dosyasında os isimli modülü  import os komutu ile çağırmayı unutmayın ve bu komutu setting.py de en üste ekleyebilirsiniz.)

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

 Bu kodun eklenmesiyle artık projemizde media isimli bir klasör oluştu. Bunu pycharm da projenizin tüm dosya klasörleri gördüğünüz ekranın sol tarafına geldiğini göreceksiniz. 

Değişiklikleri kaydetmeyi unutmayın. 

5. Şimdi profile.html dosyamızda kullancının resmini -email bilgisi gibi kullancıya özel alanların gösterilmesini sağlayalım. Biraz da görünümüyle oyanayalım.


{% extends 'blog/base.html' %}
{% load crispy_forms_tags %}
{% block content %}

<div class="content-section">
<div class="media">
<img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
<div class="media-body">
<h2 class="account-heading">{{ user.username }}</h2>
<p class="text-secondary">{{ user.email }}</p>
</div>
</div>
<!-- FORM HERE -->
</div>
{% endblock %}
Yukarıdaki kodda profil.html dosyasında kullanıcının profil resmi, kullanıcı adı ve email bilgisi 
dinamik bir şekilde çağırılmış oldu.

6.  Şimdide profil resminin görünmesi için yolu-rotayı tanımlamak gerekir. django static file dökümantasyonu baktığımızda kullanıcılar upload işlemi yapabilmesi için nasıl url tanımı yapması gerekir bakabilirsiniz.
Bu işlem için projenin urls.py dosyasına girin:

from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path, include
from users import views as user_views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
path('admin/', admin.site.urls),
path('register/',user_views.register, name='register'),
path('profile/',user_views.profile, name='profile'),
path('login/',auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
path('logout/',auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
path('', include('blog.urls')),
]

if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
NOT: media klasörünün içine default.jpg adında bir resim kaydedin. Bir kullanıcı hesabı oluşturulduğunda otomatik olarak profil resmi olarak bu resmi kullanılabilir.

7. Kullanıcılar üye olduğunda o kullanıcılara ait profil sayfasının otomatik olarak oluşturalım.
users app altında sağtuş- yeni python dosyası- signals.py dosyasını oluşturalım. signals dosyası sitemize  bir kullanıcı başarılı bir şekilde üye olduğunda otomatik olarak o kullanıcıya ait profil sayfasını( profil sayfamızı hazırlamıştık profil resmi- e mail- gibi bilgiler vardı) oluşturma sinyali gönderecek ve otomatik olarak kullanıcıya ait profili oluşturulacak(create işlemi)ve kaydedilecek(save işlemi).

users app- signals.py:

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile


@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()

8. Sırada oluşturduğumuz signal in users app e bilgirilmesi var. Bunun için users app altında apps.py dosyasına girin ve aşağıdaki kodu ekleyin.

users app - apps.py:

from django.apps import AppConfig


class UsersConfig(AppConfig):
name = 'users'

def ready(self):
import users.signals
1. Artık projenizi RUNSERVER yapıp. Yeni kullanıcı hesabı oluşturun ve bu kullanıcıya otomatik olarak profil oluşturulup oluşturulmadığını test edebilirsiniz.










Yorum Gönder

0 Yorumlar