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

Django新手求助:如何在单个模板中展示两个模型的数据?

嘿,这问题我熟!在Django模板里同时展示多个模型的数据其实很简单,不用重复写一堆冗余代码,给你两种最常用的方案:

方案1:在视图中一次性传递多个模型的查询集

这是最直接的方式,不管你用函数视图还是类视图,都可以把两个模型的数据打包进context里传给模板。

函数视图示例

假设你要展示所有饮品,以及当前登录用户的状态:

from django.shortcuts import render
from .models import Drink, status  # 提醒下:Django模型名规范是大写开头,建议改成Status哦
from django.contrib.auth.decorators import login_required

@login_required  # 如果需要用户登录才能看状态,加上这个装饰器
def dashboard(request):
    # 获取所有饮品数据
    all_drinks = Drink.objects.all()
    # 获取当前用户的状态(因为是OneToOne,用get或者filter.first都可以,注意处理不存在的情况)
    try:
        user_status = status.objects.get(user=request.user)
    except status.DoesNotExist:
        user_status = None  # 或者可以在这里创建默认状态

    # 把数据放进context字典
    context = {
        'drinks': all_drinks,
        'user_status': user_status
    }
    return render(request, 'your_template.html', context)

类视图示例(比如TemplateView)

如果用类基视图,重写get_context_data方法就行:

from django.views.generic import TemplateView
from .models import Drink, status
from django.contrib.auth.mixins import LoginRequiredMixin

class DashboardView(LoginRequiredMixin, TemplateView):
    template_name = 'your_template.html'

    def get_context_data(self, **kwargs):
        # 先获取父类的context
        context = super().get_context_data(**kwargs)
        # 添加饮品数据
        context['drinks'] = Drink.objects.all()
        # 添加当前用户状态
        try:
            context['user_status'] = status.objects.get(user=self.request.user)
        except status.DoesNotExist:
            context['user_status'] = None
        return context
模板中如何渲染数据

拿到context里的数据后,直接在模板里用模板标签遍历或展示就行:

<!-- 展示所有饮品 -->
<section>
    <h2>饮品清单</h2>
    <ul>
        {% for drink in drinks %}
            <li>{{ drink.drink_name }} - 强度: {{ drink.strength }}</li>
        {% empty %}
            <li>暂无饮品数据</li>
        {% endfor %}
    </ul>
</section>

<!-- 展示当前用户状态 -->
{% if user_status %}
<section>
    <h2>你的状态</h2>
    <p>健康值: {{ user_status.health }}</p>
</section>
{% else %}
<p>你还没有状态数据哦</p>
{% endif %}
额外小提示
  • 模型名记得改成大写Status,符合Django的命名规范,避免和内置的status混淆或者出现奇怪的问题;
  • 如果需要展示所有用户的状态,直接把status.objects.all()传到context里,然后在模板里遍历就行;
  • 处理OneToOneField的不存在情况很重要,不然用户没有状态时会抛出500错误,用try-except或者filter.first()都可以。

内容的提问来源于stack exchange,提问作者Ben P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:50:47