Почему я получаю ошибку типа Django при использовании Taggit?
Итак, я следую цифровой книге о том, как добавить теги в Django с помощью Taggit. Страница списка также использует Paginator, но вот что происходит: я получаю эту Type Error, когда я нажимаю на один из тегов, который должен перевести вас на страницу списка, но перечисляет количество постов с тем же тегом.
Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация от меня. Я очень ценю любую вашу помощь. Я взволнован, потому что это мой первый настоящий проект Django, создаю блог для друга, и пока все идет хорошо, за исключением одной проблемы, которая не поддается моему пониманию. Я также хочу научиться смотреть на экраны ошибок и знать, что искать, а затем однажды решить свои собственные проблемы.
Еще раз спасибо!
Chris
views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.views.generic import ListView
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db.models import Count
from taggit.models import Tag
from .models import Post
from .forms import PostForm
class PostListView(ListView):
queryset = Post.published.all()
context_object_name = 'posts'
paginate_by = 3
template_name = 'blog/post/list.html'
def post_list(request, tag_slug=None):
object_list = Post.published.all()
tag = None
if tag_slug:
tag = get_object_or_404(Tag, slug=tag_slug)
object_list = object_list.filter(tags__in=[tag])
paginator = Paginator(object_list, 3)
page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
return render(request, 'blog/post/list.html', {'page': page, 'posts': posts, 'tag': tag})
def post_detail(request, year, month, day, post):
post = get_object_or_404(Post, slug=post, status='published', publish__year=year, publish__month=month, publish__day=day)
post_tags_ids = post.tags.values_list('id', flat=True)
similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id)
similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags','-publish')[:3]
return render(request, 'blog/post/detail.html', {'post': post, 'similar_posts': similar_posts})
def create_post(request):
form = PostForm()
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('blog:post_list')
return render(request, 'blog/post/post_form.html', {'form': form})
def update_post(request, pk):
post = Post.objects.get(title=pk)
form = PostForm(instance=post)
if request.method == 'POST':
form = PostForm(request.POST, instance=post)
if form.is_valid():
form.save()
return redirect('blog:post_list')
return render(request, 'blog/post/post_form.html', {'form': form})
def delete_post(request, pk):
post = Post.objects.get(title=pk)
if request.method == 'POST':
post.delete()
return redirect('blog:post_list')
context = {'object': post}
return render(request, 'blog/post/delete_post.html', context)
def about(request):
return render(request, 'blog/post/about.html')
def send_mail(request):
return render(request, 'blog/post/contact.html')
models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from taggit.managers import TaggableManager
class PublishedManager(models.Manager):
def get_queryset(self):
return super(PublishedManager, self).get_queryset().filter(status='published')
class Post(models.Model):
tags = TaggableManager()
def get_absolute_url(self):
return reverse('blog:post_detail', args=[self.publish.year, self.publish.month, self.publish.day, self.slug])
objects = models.Manager()
published = PublishedManager()
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_post')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='published')
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
urls.py
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.post_list, name='post_list'),
path('tag/<slug:tag_slug>/', views.post_list, name='post_list_by_tag'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail'),
path('create_post/', views.create_post, name='create_post'),
path('update_post/<str:pk>/', views.update_post, name='update_post'),
path('delete_post/<str:pk>/', views.delete_post, name='delete_post'),
path('send_mail/', views.send_mail, name='send_mail'),
path('about/', views.about, name='about'),
]
list.html
{% extends 'blog/base.html' %}
{% block title %} Healthy Lifestyles with Gretchen {% endblock %}
{% block content %}
{% if tag %}
<h2>Posts tagged with "{{ tag.name }}" </h2>
{% endif %}
{% for post in posts %}
<div id="cards">
<div id="supplyPhoto"></div>
<h2 class="cardHeading">
<a href="{{post.get_absolute_url}}">{{post.title|truncatewords:8}}</a>
</h2>
<p class="tagsText">
TAGS: {% for tag in post.tags.all %}
<a href="{% url 'blog:post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
{% if not forloop.last %}, {% endif %}
{% endfor %}
</p>
<p class="maintext"> {{post.body|truncatewords:40}} </p>
<p class="author"><i> Published by: {{post.author}} </i> </p>
<p class="date"> <i> {{post.updated}} </i></p>
</div>
{% endfor %}
{% include "pagination.html" with page=posts %}
{% endblock %}
pagination.html
<div class="pagination">
<span class="step_links">
{% if page.has_previous %}
<a class="pagination" href="?page={{ page.previous_page_number }}">< PREVIOUS</a>
{% endif %}
<span class="current">
<p class="footer">PAGE {{page.number}} OF {{page.paginator.num_pages}}</p>
</span>
{% if page.has_next %}
<a class="pagination" href="?page={{ page.next_page_number }}">NEXT ></a>
{% endif %}
</span>
</div>
Я следую той же книге.
Это проблема с Taggit и обновлением Django. Теперь есть обновление.
pip uninstall django-taggit
pip install git+https://github.com/jazzband/djangotaggit.git@d0833966d357ed1e1b9b1f40c39c1ed99affbf9b
>