Django Taggable标签不工作,页面为空

1 投票
1 回答
46 浏览
提问于 2025-04-14 15:52

我提前道歉,如果我写得不清楚,因为我对django和stackoverflow都很陌生。我正在尝试做一个博客网站,里面有帖子等等。网站的一个重要部分是标签搜索,我想通过Taggit来实现这个功能。不过,当我点击标签的链接时,总是出现一个空白页面。我还有一个分页系统,把博客分成不同的页面。

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>

我一尝试重写代码,改变网址和视图,结果还是一样——空白页面。

1 个回答

1

问题的一部分在于,你用正则表达式来定义模式,但 path(..) 有自己特别的语法,而不是正则表达式。

我们可以这样定义路径:

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

撰写回答