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".
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 %}
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)
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()
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals
0 Yorumlar