Невозможно увидеть значения внешних ключей в шаблоне

Это моя 2-я неделя изучения Django. Я пытаюсь освоить язык шаблонов Django. Я пытаюсь сделать приложение "Инвентаризация" с 4 моделями. Представления для них основаны на классах.

Шаблоны для Ingredient и Menu работают как ожидалось. Однако у меня возникают трудности при попытке просмотреть значения из модели Purchase, которая имеет поле внешнего ключа 'menu_item'. Шаблон не показывает ничего из цикла for. Я просмотрел множество статей здесь и обнаружил, что большинство из них используют представления на основе функций. Я пробовал использовать {% for purchase in purchase_set %}, {% for purchase in purchase_set.all %}. Я знаю, что объект для итерации - это набор запросов. Я не могу понять, что делать?

MODELS.PY

from django.db import models
# Create your models here.
class Ingredient(models.Model):
    Pounds = 'lbs'
    Ounces = 'oz'
    Grams = 'gms'
    Eggs = 'eggs'
    Piece = 'piece'
    Litre = 'litre'
    unit_choices = [(Pounds, 'lbs'),
                    (Ounces, 'ounces'),
                    (Grams, 'grams'),
                    (Eggs, 'eggs'),
                    (Piece, 'piece'),
                    (Litre, 'litre')]
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    unit_price = models.FloatField(default=0.0)
    quantity = models.FloatField(default=0.0)
    unit = models.CharField(max_length=10, choices=unit_choices)
    class Meta:
        ordering = ['id']

    def __str__(self):
        return self.name
class MenuItem(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50)
    price = models.FloatField(default=0.0)
    class Meta:
        ordering = ['id']
    def __str__(self):
        return self.title
class RecipeRequirement(models.Model):
    menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    quantity = models.FloatField(default=0.0)

    def __str__(self):
        return self.menu_item.title

class Purchase(models.Model):
    menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    timestamp = models.DateTimeField()
    id = models.AutoField(primary_key=True)

    class Meta:
        ordering = ['id']
    def __str__(self):
        return self.menu_item.title

VIEWS.PY:

from django.shortcuts import render
from .models import Ingredient, MenuItem, RecipeRequirement, Purchase
from django.views.generic import ListView

def home(request):
    return render(request, 'inventory/home.html')

class IngredientView(ListView):
    model = Ingredient
    template_name = 'inventory/ingredients.html'

class PurchaseView(ListView):
    model = Purchase
    template_name = 'inventory/purchases.html'

class MenuView(ListView):
    model = MenuItem
    template_name = 'inventory/menu.html'

PURCHASES.HTML

<h3>This is purchases page.</h3>
{% block content %}
<table>
{% for purchase in purchase_set.all %}
        <tr>
            <td>{{ purchase.title }}</td>
        </tr>
{% endfor %}
</table>
{% endblock %}

Поле title, которое вы пытаетесь показать, находится в модели MenuItem, которая используется как foreignkey в модели Purchase с полем menu_item. Класс ListView возвращает в контекст ваши покупки в ключе object_list. Таким образом, в шаблоне Your purchases.html:

<h3>This is purchases page.</h3>
{% block content %}
<table>
{% for purchase in object_list %}
        <tr>
            <td>{{ purchase.menu_item.title }}</td>
        </tr>
{% endfor %}
</table>
{% endblock %}

PS. Это `purchase_set' относится к обратным отношениям. Поэтому, если вы хотите показать все покупки MenuItem, вы должны сделать:

{% for item in menuitems %}
  <h1>{{ item }}</h1>
   {% for purchase in item.purchase_set.all %}
      <p>{{ purchase.timestamp }}</p>
   {% endfor %}
{% endfor %}
Вернуться на верх