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

如何在单个Django ListView中展示多个模型的数据?

在Django单个ListView中展示多个模型数据

要在同一个ListView页面里同时展示Post和Task模型的数据,你可以通过重写ListView的get_context_data方法,把两个模型的查询集都传入模板上下文。以下是具体实现步骤:

1. 修改views.py

更新你的HomeView类,添加get_context_data方法,将当前用户的Post和Task数据都传递给模板:

from django.shortcuts import render, redirect
from django.views.generic import ListView, DetailView
from .models import Post, Task
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

@method_decorator(login_required, name='dispatch')
class HomeView(ListView):
    template_name = 'home.html'
    model = Post
    context_object_name = 'post_list'  # 给Post查询集指定别名,避免混淆

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 添加当前用户的Task数据到上下文
        context['task_list'] = Task.objects.filter(user=self.request.user)
        # 若只需展示当前用户的Post,替换默认查询集:
        # context['post_list'] = Post.objects.filter(auther=self.request.user)
        return context

@method_decorator(login_required, name='dispatch')
class TaskListView(ListView):  # 类名修改,避免和模型Task重名
    model = Task
    template_name = 'tasks.html'
    context_object_name = 'task_list'

2. 修改模板home.html

在模板中分别遍历post_list和task_list,渲染两种类型的数据:

渲染Task部分

{% for task in task_list %}
<a href="#" class="list-group-item list-group-item-action bg-transparent border border-secondary">
    <h class="mb-1">{{task.title}}</h>
    <p class="mb-1">{{task.description}}</p>
    <span class="mb-1">{{task.urgency}}</span>
</a>
{% endfor %}

渲染Post部分

{% for post in post_list %}
<span>
    <div class="card text-secondary-emphasis border border-secondary mb-4" style="background-color: #0d1117;">
        <div class="card-header border border-secondary">{{post.type}}</div>
        <div class="card-body">
            <h5 class="card-title" style="color: #c0c0c0;">{{post.title}}</h5>
            <p class="card-text">{{post.description}}</p>
            <a href="{{post.link}}" class="btn btn-outline-primary">Read More</a>
        </div>
    </div>
</span>
{% endfor %}

额外提示

  • 模型Post中的auther字段拼写有误,建议修正为author,保证语义准确。
  • 如需对数据排序或过滤,可在get_context_data中对查询集处理,例如.order_by('-id')实现倒序排列。

内容的提问来源于stack exchange,提问作者Daniel Marsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:45:46