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

