Bir önceki yayında kullanıcı hesabı oluştuğunda(register form-register sayfası ile) o kullanıcıya özel bir profilin de oluşturulması aşamasını gördük. Şimdi bu profili biraz daha geliştirelim. Oluşturulan profilde değişiklik yapılasını sağlayan yani Profil resmini ekleme-güncelleme ve profil resminin resize( yeniden boyutlandırma gibi işemleri) işlemlerini görelim.
Bu işlemler için aşağıdaki adımları izleyin.
1. users app- forms.py dosyasına geçin aşağıdaki kodları ekleyin:
Yukarıdaki kodda bir model form oluşturuldu. Bu model form belirli bir veritabanı modeliyle çalışacak ve burada oluşturduğumuz form modeli bizim user modeli update ( kullanıcı modelini güncellemeyi) etmeyi sağlayacak. Bu işlem için class UserUpdateForm( forms.Modelform ) sınıf temelli komutu eklendi. Bu komutla UserRegisterForm sınıfı ile benziyor. Ancak burda password bilgisi kullanılmayacak. Bu neden Password ile ilgili kısım kaldırıldı.from .models import Profile #bu satırı kodunuzda üste ekleyinclass UserUpdateForm(forms.ModelForm):
email = forms.EmailField() # default bıraktık zorunlu alan gibi davranır
class Meta:
model = User
fields = ['username', 'email']
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
field = ['image']
2. Şimdi oluşturulan bu formun views.py de görünümünün ayarlanmasına(import edilmesine-1. adımda UserUpdateForm, ProfileUpdateForm hazırlanmıştık) sıra geldi. Bunun için users app -views.py dosyasını açın.
users app-views.py:
a. Öncelikle oluşturduğumuz formları(UserUpdateForm, ProfileUpdateForm) import eden komutu ekleyelim.
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm
b. Oluşturduğumuz formları kullanılması için context ile profil.html sayfasına görülmesini sağlayan kodları ekleyelim.
@login_required
def profile(request):
usr_form = UserUpdateForm()
prfl_form = ProfileUpdateForm()
context = {
'usr_form': usr_form,
'prfl_form': prfl_form
}
return render(request, context,'users/profile.html')
3. Sırada profile.html dosyasına usr_form ve prfl_form bilgilerinin yerleştirilmesi var. Aşağıdaki kodları hemen {% endblock %} etiketinden önceki alana ekleyebilirsiniz.
(Ayrıca bu kodları register.html dosyasından <form method="POST" ile başlayan satır ile ......</form> etiketi aralığındaki kodları kopyalayabilir kullanablirsiniz. )
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Profil Bilgileri</legend>
{{ usr_form|crispy }}
{{ prfl_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Güncelle-update</button>
</div>
</form>
</div>
{% endblock %}
{{ usr_form|crispy }}Bu profile.html sayfası register.html sayfasına benzediği için o sayfayı değiştirerek kullandığımızı bir kere daha hatırlatalım. Dolayısıyla bazı kısımları profile.html sayfasına uygun hale getirildi.
{{ prfl_form|crispy }}
@login_required
def profile(request):
usr_form = UserUpdateForm(instance=request.user)
prfl_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'usr_form': usr_form,
'prfl_form': prfl_form
}
return render(request, 'users/profile.html', context)
@login_required
def profile(request):
if request.method == 'POST':
usr_form = UserUpdateForm(request.POST, instance=request.user)
prfl_form = ProfileUpdateForm(request.POST,
request.FILES,
instance=request.user.profile)
if usr_form.is_valid() and prfl_form.is_valid():
usr_form.save()
prfl_form.save()
messages.success(request, f' hesabınız güncellendi.')
return redirect('profile')
else:
usr_form = UserUpdateForm(instance=request.user)
prfl_form = ProfileUpdateForm(instance=request.user.profile)
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import UserRegisterForm, UserUpdateForm, ProfileUpdateForm
# Create your views here.
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f' hesabınız tanımlandı. Artık giriş yapabilirsiniz.')
return redirect('login')
else:
form = UserRegisterForm()
return render(request, 'users/register.html', {'form': form})
@login_required
def profile(request):
if request.method == 'POST':
usr_form = UserUpdateForm(request.POST, instance=request.user)
prfl_form = ProfileUpdateForm(request.POST,
request.FILES,
instance=request.user.profile)
if usr_form.is_valid() and prfl_form.is_valid():
usr_form.save()
prfl_form.save()
messages.success(request, f' hesabınız güncellendi.')
return redirect('profile')
else:
usr_form = UserUpdateForm(instance=request.user)
prfl_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'usr_form': usr_form,
'prfl_form': prfl_form
}
return render(request, 'users/profile.html', context)
def save(self):
super().save()
from PIL import Image
img = Image.open(self.image.path)
if img.height >300 or img.width >300:
output_size= (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
from django.db import models
from django.contrib.auth.models import User
from PIL import Image
# 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'
def save(self):
super().save()
img = Image.open(self.image.path)
if img.height >300 or img.width >300:
output_size= (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
<img class="rounded-circle" width="60" height="60" src="{{ post.author.profile.image.url }}">
{% extends 'blog/base.html' %}
{% block content %}
{% for post in postsA %}
<div class="container">
<img class="rounded-circle" width="60" height="60" src="{{ post.author.profile.image.url }}">
<div class="card-header-pills">
<div class="card-header">
<div>
<a class="mr-2" href="#" >{{ post.author }}</a>
<small class="text-muted">{{ post.date_posted|date:"F d, Y"}}</small>
</div>
<h1><a class="card-title" href="#" >{{ post.title }}</a></h1>
<p class="card-body"> {{ post.content }} </p>
<p>{{ post.content }}</p>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
0 Yorumlar