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

时间:2018-04-26 15:39:58

标签: 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 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 %}

返回:

Hello admin, welcome to the tavern. 

Grab a drink from the bar
Water with a strength of 0
Wine with a strength of 3
Ale with a strength of 5
Black Ale with a strength of 9

正如您所看到的,我已在模板中打印出served_drinks对象,但我也希望在此页面上打印status模型中的数据。

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

2 个答案:

答案 0 :(得分:4)

由于您使用的是{"type":"FORBIDDEN","message":"The authentication token is not valid."} 快捷方式,因此您可以将任意内容添加到render字典中:

context

然后您可以在模板中使用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_required将失败匿名用户。我还会将您的模型从Status.objects.get()重命名为status,这样您就不会将Status模型与Status个实例混淆。

但是,在这种情况下,您实际上不需要将status添加到上下文中。您可以从statususer向后关注一对一字段:

status

答案 1 :(得分:4)

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

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 }}

此外,尝试使用大写字母开始您的模型名称。因此,模型状态优于状态。这只是一种很好的做法。