Отображение контента из 2 моделей в одном шаблоне Django - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю со своим первым проектом 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 голосов
/ 26 апреля 2018

Вы должны также передать свой статусный экземпляр в контекст представления. Например, давайте получим первый экземпляр модели состояния в базе данных:

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 }} в своем шаблоне.

Кроме того, попробуйте начать названия моделей с заглавных букв. Итак, модель Status лучше, чем status. Это просто хорошие практики.

0 голосов
/ 26 апреля 2018

Поскольку вы используете ярлык 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 экземплярами.

Однако в этом случае вам не нужно добавлять status в контекст. Вы можете следить за полем «один к одному» в обратном направлении от user до status:

{{ user.status.health }}
...