Kullanıcı işlemlerini gerçekleştirecek komutları öğrenelim. Kullanıcıların hesap oluşturma(create an account-login) aşamasını hesaplarına giriş-çıkış (login-logout) gibi işlemleri yapma, giriş yaptığında(login olduğunda) gönderi(post) paylaşabilmesi gibi işlemleri-komutları oluşturalım.
İlk olarak üye olma (registration page) sayfası geliştirelim. Bölelikle üye olup post gönderebilir yorum yapabilir veya hesaptan çıkış yapabilir. Admin hesabı tanımı yapmıştık sitemizde ilgili oturum açtığında ayarlara ulabiliyordu. Şimdi üye olan kullanıcılara sitemizin isteğimiz kısmına dahil olup bir takım işleri yapmasına izin vereceğiz.(örnek: post(gönderi) gönderebilme gibi).
userlogic( Kullanıcı mantığını)projemizle nasıl bütünleştireceğimizi düşündüğümüzde user(kullanıcı hesabı ayarları) ayrı bir app olarak düşünüleblir. Kendi içinde templates i design ı, routes(URL leri olan) formları olan ayrı projemizle ilişki içinde yeni bir app gibi tasarlayabiliriz.
Kullanıcı işlemleri(user registrations) için aşağıdaki sıraya göre ilerleyelim:
1. O zaman ilk adım olarak users app i oluşturalım. Bunun için commandline(pycharm da kısayolu Alt +f12) a aşağıdaki komutu girin:
>>> py manage.py startapp users yazıp Enter a basın.
'users.apps.UsersConfig',
views.py içine aşağıdaki kodları ekleyelim:
from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
# Create your views here.
def register(request):
form = UserCreationForm()
return render(request, 'users/register.html', {'form': form})
Burada djangonun bize hazır olarak sunduğu userCreationForm u import ettik.
Birde buradaki kodda en alt satırda users/register.html dosyamızı yaratmak gerekir. Bunun için sırayla
a. users app üzeriinde sağ tuş-yeni-klasör-templates ismini verelim.
b. Templates klasörünün içine users adında bir klasör daha ekleyelim.
c. users klasörünün içinde sağ tuş-yeni-register.html dosyasını ekleyelim.
d. Şimdi register.html sayfamızı kalıtımla önceki derslerde oluşturduğumuz templates ile bağlayalım. Bunun için register.html içine girelim: blog app in altındaki templates den hakkinda.html içindeki kodu bu dosyaya da ekleyelim. ( amacımız base.html dosyasından extends etmek) ilgili kod aşağıdadır.
{% extends 'blog/base.html' %}
{% block content %}
<div class="content">
<form method="post">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Şimdi Katıl</legend>
{{ form.as_p }}
</fieldset>
<div class="form-group">
<button type="submit" class="btn btn-outline-info">Üye ol</button>
</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">
Zaten üye misiniz?
<a class="ml-3" href="#"> Giriş-Login-Sign in</a>
</small>
</div>
</div>
{% endblock %}
Kodda geçen csrf_token ifadesi formun güvenliği için gerekli bir metoddur.
e. proje altındaki urls.py gir ve aşağıdaki kodları eklenir.( Kodda 3.satır ve urlpattrens içindeki register satırı eklendi. urls.py nin son hali aşağıdaki gibi olmalıdır.
from django.contrib import admin
from django.urls import path, include
from users import views as user_views
urlpatterns = [
path('admin/', admin.site.urls),
path('register/',user_views.register, name='register'),
path('', include('blog.urls')),
]
Yukarıdaki kodu yazarak register.html dosyasının yolu urls.py içine tanımlanmış oldu.
4. Server a run edip register.html sayfanızı test edebilirsiniz. register.html sayfamızın açıldığını görebiliriz. Ancak henüz üye ol düğmesi aktif çalışmıyor. Yani kodumuzda eksiklikler var.
users altındaki views.py dosyasındaki son durum:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
# Create your views here.
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
messages.success(request, f' {username} hesabı tanımlandı')
return redirect('blog-home')
else:
form = UserCreationForm()
return render(request, 'users/register.html', {'form': form})
Yukarıdaki kodda geçen f ' string satırı Python 3.6 ya da daha yeni bir sürüm kullanmamız gerektiğini unutmayalım!
Yukarıdaki kodda redirect metodu import edildiğine dikkat edin.( Kullanıcı başarılı bir üye olma işlemi yaparsa anasayfaya yönlendirme yapıldı.
5. "Hesabını başarılıo bir şekilde açıldı." şeklinde açıklamamızı base.html içinde kullanıcıya duyurmak istiyoruz. Bunun için
base.html içine girin ve {% block content %} satırının üstüne aşağıdaki kodları ekleyin:
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% block content %}
{% endblock %}
Bu adımdaki kodda geçen message bir önceki adım olan 4.adımda yazıldığına dikkat edin.
6. Projeyi Server ı run edip tekrar register.html sayfasında geçelim.
http://127.0.0.1:8000/register/ adresine register eklendi ve Enter a basıldı. Yeni bir üyelik için formu eksiksiz doldurup bir hsap oluşturabilirsiniz.
Admin panele geçiş yapıp deneme yaptığınız kullanıcı adı bilgilerini inceleyebilirsiniz. Kullanıcı üye olurken e mail bilgisi sormak şimdi bu bilgiyi de kullanıcıdan isteyelim. Bunun için bir sonraki adımı görelim.
6. FORM djangonun bize sunduğu formu hazır kullandık. Şimdi usercreation form dan kalıtım(inheritence) yoluyla formumuza yeni alanlar ekleyelim. Bunun için önce users app in altına forms.py dosyası ekleyin ve dosyanın içine girin.
forms.py dosyasına:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm):
email = forms.EmailField() # default bıraktık zorunlu alan gibi davranır
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
Buradaki kodlarda UserRegisterForm oluşturulurken UserCreationForm dan kalıtım aldık. Class Meta ile bu forma eklenen alan diğer forma gönderilmiş oldu.
7. users app altındaki views.py dosyasına aşağıdaki satırı üst kısma ekleyin.
from .forms import UserRegisterForm
UserRegisterForm u az önce oluşturduk ve views a bu satırı yazarak bağlantı kurmuş olduk. Ama artık UserCreationForm ile ilgili satıra ihtiyacımız kalmadı onun yerine çünkü 6.adımda UserRegisterFormu kullanacağız.
Kodda UserCreationForm geçen yerleri UserRegisterForm komutuyla değiştirmeyi unutmayın.
users app altındaki views.py nin son hali:
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm
# 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' {username} hesabı tanımlandı')
return redirect('blog-home')
else:
form = UserRegisterForm()
return render(request, 'users/register.html', {'form': form})
8. Projeyi RUN edip değişiklikleri test edebilirsiniz.
http://127.0.0.1:8000/register/ adresine register eklendi Enter a basıldı. Artık üye olurken e-mail bilgisi de istenmiş oldu.
9. Hesap oluştur formundaki validasyonların gerekli alanların daha düzgün görünmesi için neler yapılabilir. 3.parti django aplikasyonu kullanabiliriz. crispy forms la çalışmayı görelim.
Crispy formu yüklemek için konsola geçin(pycharm da Alt+f12) aşağıdaki komutla kurulumu yapın.
>>>django_project1>pip install django-crispy-forms yazıp ENTER a basın. kurulum gerçekleşcektir.
Sırada bu yüklemeyi projemize belirtmemiz gerekir.Bunun için sırayla:
a. Projemizin setting.py dosyasını açın. Aşağıdaki gibi crispy forms eklemesini yapın ve sondaki virgülü unutmayın (liste tipi veri olduğu için virgülü unutmayın.)
INSTALLED_APPS = [
'users.apps.UsersConfig',
'blog.apps.BlogConfig',
'crispy_forms',
b. crispy form a CSS dosyamızın Bootstraps in versiyonu da belirtmemiz gerekir. Bunun için yine settings.py dosyasında en alta inin aşağıdaki kodu ekleyin.
CRISPY_TEMPLATE_PACK = 'bootstrap4'
{% extends 'blog/base.html' %}
{% load crispy_forms_tags %}
-register.html dosyasında geçen {{ form|.as_p }} yerine {{ form|crispy }} şeklinde değiştirin. (Çünkü formu asıl düzeltecek olan crispy isimli uygulama.)
Artık üye ol( register.html) dosyamızda görünüm daha düzgün oldu. Hatalı girişler daha dikkat çekici uyarı veriyor olmalı.
0 Yorumlar