You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django函数视图中实现按分类展示文章

没问题!要实现按分类展示文章的功能,我们可以分几步来完成,从视图、URL到模板逐一调整:

1. 新增分类详情视图函数

首先在你的post/views.py里添加一个专门处理单个分类文章展示的视图,它会根据分类的slug获取对应分类,并筛选出该分类下的所有文章:

from django.shortcuts import get_object_or_404

def category_posts(request, category_slug):
    # 通过slug获取目标分类,找不到则返回404页面
    category = get_object_or_404(Category, slug=category_slug)
    # 筛选该分类下的文章,按发布时间倒序排列
    posts = Post.objects.filter(category=category).order_by('-date_posted')
    
    context = {
        'category': category,
        'posts': posts,
        'title': category.title  # 页面标题直接用分类名称
    }
    return render(request, 'posts/category_posts.html', context)

如果你的分类是多级结构(有父分类和子分类),想要把父分类下所有子分类的文章也展示出来,可以修改视图里的文章筛选逻辑:

def category_posts(request, category_slug):
    category = get_object_or_404(Category, slug=category_slug)
    # 获取当前分类及其所有子分类的ID集合
    category_ids = [category.id] + list(category.children.values_list('id', flat=True))
    # 筛选属于这些分类的所有文章
    posts = Post.objects.filter(category__id__in=category_ids).order_by('-date_posted')
    
    context = {
        'category': category,
        'posts': posts,
        'title': category.title
    }
    return render(request, 'posts/category_posts.html', context)

2. 配置分类页面的URL路由

在你的urls.py(可以是app下的urls或项目根urls)里添加分类页面的路由:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.posts_list, name='posts-list'),
    # 新增分类文章页面的路由,用slug作为参数
    path('category/<slug:category_slug>/', views.category_posts, name='category-posts'),
]

3. 修改首页模板,添加分类跳转链接

在你的posts/home.html里,给分类列表添加跳转链接,让用户可以点击分类进入对应页面:

<!-- 假设你原本的分类列表是这样的,添加a标签即可 -->
<h3>所有分类</h3>
<ul>
{% for cat in category %}
    <li><a href="{% url 'category-posts' cat.slug %}">{{ cat.title }}</a></li>
{% endfor %}
</ul>

4. 创建分类文章展示模板

新建posts/category_posts.html模板,用来展示单个分类下的文章,页面标题直接使用分类名称:

{% extends 'base.html' %} <!-- 替换成你自己的基础模板名称 -->

{% block content %}
    <h1>{{ category.title }}</h1> <!-- 页面标题为分类名称 -->
    
    {% if posts %}
        {% for post in posts %}
            <div class="post-card">
                <h2><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
                <p>作者: {{ post.author.username }} | 发布时间: {{ post.date_posted|date:"Y-m-d" }}</p>
                {% if post.image %}
                    <img src="{{ post.image.url }}" alt="{{ post.title }}" style="max-width: 300px;">
                {% endif %}
                <p>{{ post.content|truncatewords:30 }}</p>
                <a href="{{ post.get_absolute_url }}">阅读全文</a>
            </div>
            <hr>
        {% endfor %}
    {% else %}
        <p>这个分类下还没有文章哦~</p>
    {% endif %}
{% endblock %}

额外提醒(可选)

如果你的文章图片无法正常显示,需要确保在settings.py里配置了媒体文件路径:

MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'

并在项目根urls.py里添加媒体文件的路由:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

内容的提问来源于stack exchange,提问作者aditya kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:21:09