Теги Django Taggable не работают, пустая страница
Заранее прошу прощения, если напишу что-то непонятное, я новичок и в django, и в stackoverflow. Я пытаюсь реализовать сайт-блог, с постами и всем прочим. Важной частью сайта является поиск по тегам, который я пытаюсь реализовать через Taggit. Однако, когда я нажимаю на ссылку tag url, я всегда получаю пустую страницу. У меня также есть система пагинации, которая делит блог на разные страницы.
urlpatterns = [
path('', views.PostList.as_view(), name="home"),
path(r'^$', views.post_list, name='post_list'),
path(r'^tag/(?P<tag_slug>[-\w]+)/$', views.post_list, name='post_list_by_tag'),
]
class Post(models.Model):
title = models.CharField(max_length = 250, unique = True)
slug = models.CharField(max_length = 200, unique = True)
type = models.CharField(max_length=100, choices=Type_CHOICES)
section = models.CharField(max_length=100, choices=Section_CHOICES)
tags = TaggableManager()
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Post
from django.views import generic
from taggit.models import Tag
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def post_list(request, tag_slug=None):
object_list = Post.objects.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) # 3 posts in each page
page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer deliver the first page
posts = paginator.page(1)
except EmptyPage:
# If page is out of range deliver last page of results
posts = paginator.page(paginator.num_pages)
return render(request, 'index.html', {'page': page,
'posts': posts,
'tag': tag,
'/media': Post.image})
<p>Tags:
{% for tag in post.tags.all %}
<a class="tag" href="{% url 'post_list_by_tag' tag %}">
{{ tag.name }}
</a>
{% if not forloop.last %}, {% endif %}
{% endfor %}
</p>
Как только я попытался переписать его и изменить урлы и представления, результат был тот же - пустая страница.
Ну, часть проблемы в том, что вы определяете шаблон с помощью regex, но path(..)
имеет специальный синтаксис, а не regex:
Мы можем определить путь так:
urlpatterns = [
path('', views.post_list, name='home'),
path('tag/<slug:tag_slug>/', views.post_list, name='post_list_by_tag'),
]
с видом:
def post_list(request, tag_slug=None):
object_list = Post.objects.all()
tag = None
if tag_slug:
tag = get_object_or_404(Tag, slug=tag_slug)
object_list = object_list.filter(tags=tag)
paginator = Paginator(object_list, 3) # 3 posts in each page
page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer deliver the first page
posts = paginator.page(1)
except EmptyPage:
# If page is out of range deliver last page of results
posts = paginator.page(paginator.num_pages)
return render(
request, 'index.html', {'page': page, 'posts': posts, 'tag': tag}
)