From 85357054c8ae74ed8b4adab9b2037e7e9b5dac0f Mon Sep 17 00:00:00 2001
From: alfonso
Date: Wed, 10 Nov 2021 18:26:52 -0300
Subject: [PATCH 1/4] =?UTF-8?q?usando=20page=5Fobj=20que=20=C3=A9=20pasado?=
=?UTF-8?q?=20pela=20Listview?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
mysite/blog/templates/blog/post/list.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mysite/blog/templates/blog/post/list.html b/mysite/blog/templates/blog/post/list.html
index c075af6..2bdb744 100644
--- a/mysite/blog/templates/blog/post/list.html
+++ b/mysite/blog/templates/blog/post/list.html
@@ -15,5 +15,5 @@
{{ post.body|truncatewords:30|linebreaks }}
{% endfor %}
- {% include "../pagination.html" with page=posts %}
+ {% include "../pagination.html" with page=page_obj %}
{% endblock %}
\ No newline at end of file
From 1b7cfb9e110f225a1e75e28173b06eace282e760 Mon Sep 17 00:00:00 2001
From: alfonso
Date: Sat, 13 Nov 2021 15:26:34 -0500
Subject: [PATCH 2/4] Feature: tags nos posts
Modelagem para tags
Mostrando tags do post
Mostrando tags por post
URL para exibir post por tags
Tratamento para aceitar tags e filtrar caso seja requesitado
app taggit adicionado
lib django-taggit instalada
---
.../migrations/0003_auto_20211113_1857.py | 24 +++++++++++++++++++
mysite/blog/models.py | 2 ++
mysite/blog/templates/blog/post/detail.html | 1 +
mysite/blog/templates/blog/post/list.html | 13 +++++++++-
mysite/blog/urls.py | 10 ++++++--
mysite/blog/views.py | 14 ++++++++---
mysite/settings.py | 3 ++-
requirements.txt | 6 +++++
8 files changed, 66 insertions(+), 7 deletions(-)
create mode 100644 mysite/blog/migrations/0003_auto_20211113_1857.py
create mode 100644 requirements.txt
diff --git a/mysite/blog/migrations/0003_auto_20211113_1857.py b/mysite/blog/migrations/0003_auto_20211113_1857.py
new file mode 100644
index 0000000..cc3afb2
--- /dev/null
+++ b/mysite/blog/migrations/0003_auto_20211113_1857.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.2.9 on 2021-11-13 18:57
+
+from django.db import migrations
+import taggit.managers
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('taggit', '0003_taggeditem_add_unique_index'),
+ ('blog', '0002_comment'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='comment',
+ options={'ordering': ('-created',)},
+ ),
+ migrations.AddField(
+ model_name='post',
+ name='tags',
+ field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
+ ),
+ ]
diff --git a/mysite/blog/models.py b/mysite/blog/models.py
index e0bc2b4..47a22f3 100644
--- a/mysite/blog/models.py
+++ b/mysite/blog/models.py
@@ -2,6 +2,7 @@
from django.db import models
from django.urls import reverse
from django.utils import timezone
+from taggit.managers import TaggableManager
class PublishedManager(models.Manager):
@@ -24,6 +25,7 @@ class Post(models.Model):
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
objects = models.Manager()
published = PublishedManager()
+ tags = TaggableManager()
def get_absolute_url(self):
return reverse('blog:post_detail',
diff --git a/mysite/blog/templates/blog/post/detail.html b/mysite/blog/templates/blog/post/detail.html
index 7c57f26..f6c3167 100644
--- a/mysite/blog/templates/blog/post/detail.html
+++ b/mysite/blog/templates/blog/post/detail.html
@@ -13,6 +13,7 @@ {{ post.title }}
Share this post
+ Tags: {{ post.tags.all|join:", " }}
{% with comments.count as total_comments %}
diff --git a/mysite/blog/templates/blog/post/list.html b/mysite/blog/templates/blog/post/list.html
index 2bdb744..2b0ffdf 100644
--- a/mysite/blog/templates/blog/post/list.html
+++ b/mysite/blog/templates/blog/post/list.html
@@ -4,16 +4,27 @@
{% block content %}
My Blog
+ {% if tag %}
+ Posts tagged with "{{ tag.name }}"
+ {% endif %}
{% for post in posts %}
+
+ Tags:
+ {% for tag in post.tags.all %}
+ {{ tag.name }}
+ {% if not.foorloop.last %}, {% endif %}
+ {% endfor %}
+
Published {{ post.publish }} by {{ post.author }}
{{ post.body|truncatewords:30|linebreaks }}
+
{% endfor %}
- {% include "../pagination.html" with page=page_obj %}
+ {% include "../pagination.html" with page=posts %}
{% endblock %}
\ No newline at end of file
diff --git a/mysite/blog/urls.py b/mysite/blog/urls.py
index 66193c7..4b01e29 100644
--- a/mysite/blog/urls.py
+++ b/mysite/blog/urls.py
@@ -5,8 +5,14 @@
app_name = 'blog'
urlpatterns = [
- # path('', views.post_list, name='post_list'),
- path('', views.PostListView.as_view(), name='post_list'),
+ # Listar todos os posts
+ path('', views.post_list, name='post_list'),
+ # Listar posts baseado num tag
+ path('tag//', views.post_list, name='post_list_by_tag'),
+ # path('', views.PostListView.as_view(), name='post_list'),
+ # Detalhe de uma view
path('////', views.post_detail, name='post_detail'),
+ # Compartilhar view
path('/share/', views.post_share, name='post_share')
+
]
diff --git a/mysite/blog/views.py b/mysite/blog/views.py
index 4485c3a..57e38b0 100644
--- a/mysite/blog/views.py
+++ b/mysite/blog/views.py
@@ -1,8 +1,8 @@
from django.core.mail import send_mail
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
-from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView
+from taggit.models import Tag
from mysite.blog.forms import EmailPostForm, CommentForm
from mysite.blog.models import Post
@@ -15,8 +15,16 @@ class PostListView(ListView):
template_name = 'blog/post/list.html' # O padrão é blog/list.html
-def post_list(request):
+def post_list(request, tag_slug=None):
object_list = Post.published.all()
+ tag = None
+ if tag_slug:
+ # A seguinte linha retorna o modelo obtido no banco a partir do tag_slug
+ tag = get_object_or_404(Tag, slug=tag_slug)
+ # De todos os posts publicados, filtra segundo a tag (objeto obtido anteriormente)
+ # Filtragem de um modelo baseado em outro
+ object_list = object_list.filter(tags__in=[tag])
+
paginator = Paginator(object_list, 3) # tres postagens em cada página
page = request.GET.get('page')
try:
@@ -27,7 +35,7 @@ def post_list(request):
except EmptyPage:
# Se a página estiver fora fo intervalo, exibe a última página de resultados
posts = paginator.page(paginator.num_pages)
- return render(request, 'blog/post/list.html', {'posts': posts})
+ return render(request, 'blog/post/list.html', {'posts': posts, 'page': page, 'tag': tag})
def post_detail(request, year, month, day, post):
diff --git a/mysite/settings.py b/mysite/settings.py
index 1343db2..aa0995a 100644
--- a/mysite/settings.py
+++ b/mysite/settings.py
@@ -38,7 +38,8 @@
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
- 'mysite.blog.apps.BlogConfig'
+ 'mysite.blog.apps.BlogConfig',
+ 'taggit'
]
MIDDLEWARE = [
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..9f172b9
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,6 @@
+asgiref==3.4.1
+Django==3.2.9
+django-taggit==1.5.1
+python-decouple==3.5
+pytz==2021.3
+sqlparse==0.4.2
From 5278be8258c20485de8b36818f26ad256210ed52 Mon Sep 17 00:00:00 2001
From: alfonso
Date: Sat, 13 Nov 2021 18:23:12 -0500
Subject: [PATCH 3/4] Exibindo posts similares (com o mesmo tag)
---
mysite/blog/templates/blog/post/detail.html | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/mysite/blog/templates/blog/post/detail.html b/mysite/blog/templates/blog/post/detail.html
index f6c3167..9dbc499 100644
--- a/mysite/blog/templates/blog/post/detail.html
+++ b/mysite/blog/templates/blog/post/detail.html
@@ -13,8 +13,22 @@ {{ post.title }}
Share this post
- Tags: {{ post.tags.all|join:", " }}
+
+ Tags:
+ {% for tag in post.tags.all %}
+ {{ tag.name }}
+ {% if not.foorloop.last %}, {% endif %}
+ {% endfor %}
+
+ Similar Posts
+ {% for post in similar_posts %}
+
+ {{ post.title }}
+
+ {% empty %}
+ There is no similar posts yet.
+ {% endfor %}
{% with comments.count as total_comments %}
{{ total_comments }} comment{{total_comments|pluralize }}
From 04f1fe64ab115faaee6cb60f44dec8e5519c7361 Mon Sep 17 00:00:00 2001
From: alfonso
Date: Sat, 13 Nov 2021 18:23:40 -0500
Subject: [PATCH 4/4] criado contexto de posts similares
---
mysite/blog/views.py | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/mysite/blog/views.py b/mysite/blog/views.py
index 57e38b0..1d70b6a 100644
--- a/mysite/blog/views.py
+++ b/mysite/blog/views.py
@@ -1,5 +1,6 @@
from django.core.mail import send_mail
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
+from django.db.models import Count
from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView
from taggit.models import Tag
@@ -57,9 +58,20 @@ def post_detail(request, year, month, day, post):
else:
comment_form = CommentForm()
+ # Pag. 87
+ # Lista de id de tags do post atual. Ex.:
+ post_tags_ids = post.tags.values_list('id', flat=True)
+
+ # Lista de postagens semelhantes Ex. :, ]>
+ similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id)
+
+ # Lista dos 4 primeiros objetos tipo posts baseado no atributo criado -same_tags-
+ similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags', '-publish')[:4]
+
return render(request, 'blog/post/detail.html',
{'post': post, 'comments': comments,
- 'new_comment': new_comment, 'comment_form': comment_form})
+ 'new_comment': new_comment, 'comment_form': comment_form,
+ 'similar_posts': similar_posts})
def post_share(request, post_id):