Django视图中如何使用多查询集构建博客首页?
在Django首页展示多模型文章的实现方案
没问题,我来帮你搞定这个需求!其实在视图里处理多个模型的查询集并传递到模板非常简单,下面分函数视图和类视图两种常用方式给你演示:
方法一:使用函数视图(Function-Based View)
首先在你的blog/views.py里导入需要的模型,然后定义首页视图,分别为每个模型获取需要的文章数据,最后把所有查询集打包到上下文里传给模板:
from django.shortcuts import render from .models import topicone, topictwo def home(request): # 从topicone中获取最新的5篇文章(按日期倒序) topicone_posts = topicone.objects.order_by('-date')[:5] # 同理处理topictwo topictwo_posts = topictwo.objects.order_by('-date')[:5] # 把多个查询集放到上下文字典里 context = { 'topicone_posts': topicone_posts, 'topictwo_posts': topictwo_posts, } return render(request, 'blog/home.html', context)
方法二:使用类视图(Class-Based View,比如TemplateView)
如果你习惯用类视图,可以继承TemplateView,重写get_context_data方法来添加多个模型的查询集:
from django.views.generic.base import TemplateView from .models import topicone, topictwo class HomeView(TemplateView): template_name = 'blog/home.html' def get_context_data(self, **kwargs): # 先获取默认的上下文 context = super().get_context_data(**kwargs) # 添加各个模型的查询集 context['topicone_posts'] = topicone.objects.order_by('-date')[:5] context['topictwo_posts'] = topictwo.objects.order_by('-date')[:5] return context
模板中渲染数据
接下来在你的home.html模板里,就可以分别循环渲染每个模型的文章了:
<!-- 展示topicone的文章 --> <h2>Topic One 最新文章</h2> <ul> {% for post in topicone_posts %} <li> <h3>{{ post.title }}</h3> <p>发布时间: {{ post.date|date:"Y-m-d H:i" }}</p> </li> {% empty %} <li>暂无文章</li> {% endfor %} </ul> <!-- 展示topictwo的文章 --> <h2>Topic Two 最新文章</h2> <ul> {% for post in topictwo_posts %} <li> <h3>{{ post.title }}</h3> <p>发布时间: {{ post.date|date:"Y-m-d H:i" }}</p> </li> {% empty %} <li>暂无文章</li> {% endfor %} </ul>
额外小提示
如果你的模型数量很多,重复写
order_by('-date')[:5]有点冗余,可以考虑给每个模型添加一个自定义管理器,封装这个逻辑,比如:class LatestPostManager(models.Manager): def get_latest(self, count=5): return self.order_by('-date')[:count] class topicone(models.Model): title = models.CharField(max_length=200) date = models.DateTimeField() # 添加自定义管理器 objects = LatestPostManager() def __str__(self): return self.title这样在视图里就可以直接写
topicone.objects.get_latest(5),更简洁!记得在
urls.py里把首页视图和URL对应起来,比如函数视图:from django.urls import path from .views import home urlpatterns = [ path('', home, name='home'), ]类视图的话:
from .views import HomeView urlpatterns = [ path('', HomeView.as_view(), name='home'), ]
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

