Python 在单个Django模板上显示两个模型的内容

Python 在单个Django模板上显示两个模型的内容,python,django,django-templates,Python,Django,Django Templates,我正在处理我的第一个Django项目,我已经使用视图将我的第一个模板标记打印到我的页面模板上。我想在页面上显示一些其他数据库值,但重复相同的过程似乎是错误的 以下是我的两个模型: class Drink(models.Model): drink_name = models.CharField(max_length=100) strength = models.IntegerField(default=0) def __str__(self): return

我正在处理我的第一个Django项目,我已经使用视图将我的第一个模板标记打印到我的页面模板上。我想在页面上显示一些其他数据库值,但重复相同的过程似乎是错误的

以下是我的两个模型:

class Drink(models.Model):
    drink_name = models.CharField(max_length=100)
    strength = models.IntegerField(default=0)
    def __str__(self):
        return self.drink_name


class status(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    health = models.IntegerField(default=100)
    strength = models.IntegerField(default=50)
    charisma = models.IntegerField(default=50)
我的看法是:

from django.shortcuts import render

from .models import Drink
from .models import status

# Create your views here.
def index(request):
    served_drinks = Drink.objects.order_by('strength')
    context = {'served_drinks': served_drinks}
    return render(request, 'tavern/index.html', context)
和我的模板:

  Hello {{ user.get_username }}, welcome to the tavern.

  <br><br>

  <div class="card-panel teal lighten-3">Grab a drink from the bar</div>
  {% if served_drinks %}
      <ul>
      {% for drink in served_drinks %}
          <li>{{ drink.drink_name }} with a strength of {{ drink.strength }}</li>
      {% endfor %}
      </ul>
  {% else %}
      <p>No drinks are available.</p>
  {% endif %}
正如您所看到的,我已经在模板中打印出了我的
served\u饮料
对象,但我也希望打印出此页面上
状态
模型的数据


我试图简单地将
{{status.health}}
添加到模板中,但这不起作用。我是否应该在
索引中添加额外信息
视图?如果是这样,如果我想在多个页面上显示此信息,该怎么办?

由于您使用的是
render
快捷方式,因此您可以向
上下文添加任何需要的内容

from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    served_drinks = Drink.objects.order_by('strength')
    context = {
        'served_drinks': served_drinks,
        'status': Status.objects.get(user=request.user),
    }
    return render(request, 'tavern/index.html', context)
然后可以在模板中使用
{{status.health}
。请注意,使用了所需的
login\u
装饰程序,以便只有登录的用户才能访问视图,否则对于匿名用户,
Status.objects.get()
将失败。我还将您的模型从
状态
重命名为
状态
,这样您就不会将
状态
模型与
状态
实例混淆

但是,在本例中,实际上不需要将
状态添加到上下文中。您可以按照一对一字段从
用户
向后到
状态

{{ user.status.health }}

您还应该将状态实例传递给视图的上下文。例如,让我们在数据库中获取状态模型的第一个实例:

def index(request):
    served_drinks = Drink.objects.order_by('strength')
    status = status.objects.all().first()
    context = {'served_drinks': served_drinks, 'status': status}
    return render(request, 'tavern/index.html', context)
现在,您可以在模板中使用
{{status.health}


另外,试着用大写字母开始你的型号名称。所以,模型状态比状态好。这只是一个很好的实践。

谢谢@Alasdair-我看到错误
状态匹配查询不存在。
,我是否需要添加一行,如另一个答案中所述的
Status=Status.objects.all().first()
?这是必需的吗?这意味着数据库中没有该用户的状态。如果执行
Status.objects.first()
操作,将停止错误,但状态可能与用户无关。啊哈,你说得对!假设创建字段会将它们添加到数据库中,但事实并非如此。实际上,我必须更改这些值才能将它们激发到数据库中!谢谢您,当我使用您的代码时,在调用
{{status.Health}
时,我仍然会在呈现的页面上看到
健康:
。当我简单地添加
{{status}}
时,我看到
健康:无
,我在这里缺少什么@奥尔扎斯
def index(request):
    served_drinks = Drink.objects.order_by('strength')
    status = status.objects.all().first()
    context = {'served_drinks': served_drinks, 'status': status}
    return render(request, 'tavern/index.html', context)