Мне удается решить проблему с тегами taggit, хотя это больше похоже на внешний вид, чем на документ или другое решение на основе.
models.py
from django.db import models
from django.utils import timezone
from taggit.managers import TaggableManager
class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(
default=timezone.now)
published_date = models.DateTimeField(
blank=True, null=True)
tags = TaggableManager()
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
ursl.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.post_list, name='post_list'),
url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
url(r'^tag/(?P<tag>\w+)/$', views.tag_detail, name='tag_detail'),
]
До тех пор это довольно очевидно.
views.py
from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
def tag_detail(request, tag):
posts = Post.objects.filter(tags__slug=tag)
return render(request, 'blog/tag_detail.html', {"posts": posts, "tag": tag})
Так что в тэге tag_detail я использую фильтрацию tags__slug=tag
.Моя единственная главная проблема по этому поводу (хотя она работает отлично), когда я нашел это решение по счастливой случайности, я не нашел ничего ни в разделе документации поиска django , ни в документации * taggit 1018 *.
Прежде чем я забуду html-файл страницы результатов тега:
{% extends 'blog/base.html' %}
{% block content %}
<h2>Posts tagged: {{tag}}</h2>
{% for post in posts %}
<p>{{ post.published_date }}: <a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></p>
{% endfor %}
{% endblock %}
Если у кого-то есть идеи, почему и как это работает, пожалуйста, дайте мне знать.