PYTHON-DJANGO-BLOG PROJE ÇALIŞMASI 11 ( Oluşturulan postların(gönderi veya yayın) sayfalanması yani pagination işlemleri

Blog yapım projemizde sıra geldi. Anasayfaya düşen gönderilerin-yazıların veya yayınların sürekli artmasıyla birlikte anasayfa sürekli dolacak eski sayfalara ulaşmak için kaydırma çubuğu veya fare tekeriyle aşağıya doğru inmek isteyeceksiniz. İşte bu durumun önüne geçmek için anasayfada bulunan gönderi sayısını ayarlayacağız yine diğer sayfalara ulaşmakk için ilksayfa-bir önceki sayfa -bir sonraki sayfa- gibi seçeneklerin görünmesini sağlayarak kullanıcıların diğer sayfalara daha raht ulaşmasını sağlayacağız.

Bu işlemler ile yapılması gerekenlere başlayalım:

1. Posts.json dosyası indirmemiz gerekir. Bu dosya aslında bizim blog sitemizin anasayfasında görünecek olan yazılar ve başlıklardan oluşan örnek bir içeriği barındırıyor olacak. Yani hazır girilmiş post lar var. Biz bunları bu dısarıdan hazır halde kullanacağız. Çünkü örneği rahat anlayalım diye bir sürü sayfa olsun istiyoruz.

Bu dosyayı şu linkten indirebilirsiniz.

indirmek için tıklayın



2. Bu dosyayı blog projenizde manage.py nin bulunduğu klasöre yerleştirin.

3. Şimdi bu dosyadaki içerikleri shell i kullanarak projemize ekliyoruz. Shell i açmak için TERMİNAL de aşağıdaki işlemleri yapın Her satırda ENTER a basmayı unutmayın.

>>> python manage.py shell yazıp ENTER a basın.

>>> import json

>>>from blog.models import Post

>>>with open('posts.json') as f: ( dikkat:manage.py ile aynı dizinde olduğu için bu satır yeterli)

.... posts_json = json.load(f) (dikkat burada üç nokta çıktı iki boşluk bırakıp öyle komutu yazın)

... (Tekrar Enter a basın aşağıya insin)

>>>for post in posts_json:

.... post = Post(title=post['title'], context= post['content'], author_id=post[' user_id']) ( Dikkat!! iki boşluk-space tuşu yapıp bu satırı yazınız)

.... post.save( ) (Dikkat İki kez ENTER yapıp ardından exit() komutu yazılır ve çıkılır.




4. RUNSERVER yapıp sitenizi açın karşınızda bir sürü (25 tane) hazır gönderi-post gelmiş oldu.

PAGINATIONS İŞLEMLERİNE BAŞLAYALIM BUNUN İÇİN AŞAĞIDAKİ ADIMLARI SIRAYLA PROJENİZDE YAPABİLİRSİNİZ.

1. blog apps-views.py dosyasına gir.

a.  aşağıdaki kodu bu sayfaya ekleyin. paginate_by = 2 kodu anasayfamızda kaç post görünmesini istiyorsak onu belirledi.

class PostListView(ListView):
model = Post
...
.....
....
paginate_by = 2
b. Şimdi ilk 2 postumuz görüntülenmiş olması gerekir. Peki diğerlerine ulaşmamızı sağlayacak linkler diğer sayfa -önceki sayfa gibi linkler ekleyelim. Bunun için;

home.html ye girin;

Aşağıdaki kodu endblock kodunun üstüne yerleştirin.
    {% if is_paginated %}
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page=1">İlk sayfa</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Önceki sayfa</a>
{% endif %}

{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<a class="btn btn-outline-info" href="?page={{ num }}">{{ num }}</a>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>

{% endif %}
{% endfor %}

{% if page_obj.has_next %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Sonraki sayfa</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Son sayfa</a>
{% endif %}


{% endif %}
{% endblock %}

Artık blog projemizde İLK SAYFA- GERİ-İLERİ-SON SAYFA GİBİ seçnenekler oluştu ve tıklanabilir duruma geldi.

GÖNDERİ-POST YAZAN KİŞİLERİN ÜZERİNE TIKLANDIĞINDA O YAZARIN PROFİLİNE VEYA BİR SAYFAYA ERİŞMESİNİ SAĞLAYALIM.

blog apps- views.py içine girilir:

1. Anasayfada postları listeleme işine benzerlik gösteriyor. bunun için de aşağıdaki işlemler sırayla yapılır.

a. sayfanın en üstüne aşağıdaki satırın sonundaki error sınıfı çağırılır. Bir de user satırı eklendiğini görüyorsunuz.

from django.shortcuts import render, get_object_or_404
.
from django.contrib.auth.models import User

b. Aşağıdaki kodlar eklenir. 

class UserPostListView(ListView):
model = Post
template_name = 'blog/user_posts.html' # <app>/<model>_ <viewtype>.html
context_object_name = 'postsA'
paginate_by = 2

def get_queryset(self):
user = get_object_or_404(User, username= self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')

c. blog apps-urls.py gir:

UserPostListView eklendi. bir de urls pattern eklenmiş oldu.

...
from .views import PostListView, PostDetailView, 
PostCreateView, PostUpdateView, PostDeleteView, UserPostListView
...

urlpatterns = [
....

path('user/<str:username>', UserPostListView.as_view(), name="user-posts"),
....
]

d. Şimdi de html sayfamızı oluşturalım. Dosyamızın adı user_posts.html olarak oluşturalım. home.html e benzediği için ordaki kodları kopyallayablirisiniz. user_posts.html dosyasının son hali aşağıdaki gibidir.


{% extends 'blog/base.html' %}

{% block content %}
<h1 class="mb-3">({{ page_obj.paginator.count }}) {{ view.kwargs.username }} yazar tarafından yazılan gönderiler:</h1>
{% 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="{% url 'user-posts' post.author.username %}" >{{ post.author }}</a>
<small class="text-muted">{{ post.date_posted|date:"F d, Y"}}</small>
</div>
<h1><a class="card-title" href="{% url 'post-detail' post.id %}" >{{ post.title }}</a></h1>
<p class="card-body"> {{ post.context }} </p> <!--content yerine context yazıldı-->

</div>
</div>
</div>
{% endfor %}
{% if is_paginated %}
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page=1">İlk sayfa</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Önceki sayfa</a>
{% endif %}

{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<a class="btn btn-outline-info" href="?page={{ num }}">{{ num }}</a>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>

{% endif %}
{% endfor %}

{% if page_obj.has_next %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Sonraki sayfa</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Son sayfa</a>
{% endif %}


{% endif %}
{% endblock %}

e. 

home.html sayfasına aşağıdaki kodu ekleyin. Bu sayfada çalışmayan line tanımlama yapıldı.

<a class="mr-2" href="{% url 'user-posts' post.author.username %}" >{{ post.author }}</a>

bu işlemi post-detail.html içinde yapalım.

<a class="mr-2" href="{% url 'user-posts' object.author.username %}" >{{ object.author }}</a>


En son olarak post göndren bir yazara tıklandığında o yazara ait diğer postları da listelemeyi görmüş olduk.






Yorum Gönder

0 Yorumlar