Подробная страница тега Django с тегом - PullRequest
0 голосов
/ 31 мая 2018

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

AdminScreen

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

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

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

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

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

1 Ответ

0 голосов
/ 04 июня 2018

Мне удается решить проблему с тегами 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 %}    

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

...