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 %}

{{ post.title }}

+

+ 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):