Страница сведений о теге Django с taggit

У меня очень похожая проблема, подобная этой post. Короче говоря, у меня есть блог django, и для тегов я использую django-taggit, который хорошо работает на странице администратора.

Экран администратора

Моя основная проблема заключается в том, что если мне нравится фильтровать тег по URL-адресу, я все равно получаю ошибку 404, хотя я перечитал документацию и пару сообщений stackoverflow:

Страница не найдена (404) Метод запроса: URL запроса GET: http://127.0.0.1:8080/tag/sample/

просмотры.py

from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404
from taggit.models import Tag


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):
    tag = get_object_or_404(Tag, tag=tag)
    return render(request, 'blog/tag_detail.html', {'tag': tag})

urls.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'),
]

модели.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 ttags(self):
        return [t.name for t in self.tags.all()]

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title


class Tag(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

Я точно знаю, что я что-то упускаю (может быть, что-то простое), просто не могу понять, что это такое. Как я могу решить эту проблему? Спасибо за помощь заранее.


person Róbert Pécz    schedule 31.05.2018    source источник
comment
Хорошо, я сильно сомневался, что кто-то отреагирует на это, но я могу избежать 404 с этим в views.py [ссылка]pastebin.com/2V6Y6PQX Следующая проблема заключается в том, что он не показывает сообщения в блоге, поэтому я могу только проверить URL-адреса. Я изменил регулярное выражение в urls.py на это: pastebin.com/XC9X5Pxh. Если кто поможет заранее спасибо   -  person Róbert Pécz    schedule 01.06.2018


Ответы (1)


Мне удалось исправить проблему с тегами taggit, хотя это больше похоже на внешний вид, чем на документ или другое решение.

модели.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'),
]

До тех пор это довольно очевидно.

просмотры.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.

Прежде чем я забуду 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 %}    

Если у кого-то есть идеи, почему и как это работает, пожалуйста, дайте мне знать.

person Róbert Pécz    schedule 04.06.2018