如何在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
相关产品推荐
相关产品推荐

