[FIXED] Warum zeigt die ListView keine Daten in der Vorlage an?

Ausgabe

Ich arbeite an meinem ersten Django-Projekt (dem Abschlussprojekt für die Django-Klasse von codecademy) und erstelle Webseiten, um das Inventar und die Speisekarte eines Restaurants anzuzeigen. Ich habe das Modell, die Ansicht, die Vorlage usw. für das Inventar erstellt und es zeigt die ListView perfekt an. Ich habe das gleiche für mein Menü gemacht und es funktioniert nicht. Die Seite wird geladen, aber die Tabelle, die Daten ausgeben soll, ist leer.

Irgendwelche Erkenntnisse darüber, was schief laufen könnte?

PS Ich bin neu in der Programmierung und dies ist mein erster Stackoverflow-Beitrag, also verzeihen Sie Formatierungsfehler oder andere Fauxpas

## views.py

from django.http import HttpResponse
from django.shortcuts import render
from .models import Inventory, MenuItem, RecipeRequirement, Purchase
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from django.views.generic import ListView

# Create your views here.
def index(request):
    return render(request, "index.html")

class InventoryList(ListView):
    template_name = "inventory.html"
    model = Inventory

class MenuList(ListView):
    template_name = "menu.html"
    model = MenuItem

Inventar (unten) funktioniert gut! 🙂

{% extends './base.html' %}
{% block content %}
<h2>Inventory</h2>
<table id="inventory">
  <tr>
    <th>Ingredient</th>
    <th>Price</th>
    <th>Units Available</th>
  </tr>
  {% for ingredient in inventory_list %}
  <tr>
  <tr>
      <td>{{ ingredient.ingredient_name }}</td>
      <td>{{ ingredient.price }}</td>
      <td>{{ ingredient.units_avail }}</td>
  </tr>
  {% endfor %}
</table>
{% endblock %}

Dieses (Menü) ist das problematische 🙁

{% extends './base.html' %}
{% block content %}
<h2>Menu</h2>
<table id="menu">
  <tr>
    <th>Item</th>
    <th>Price</th>
    <th>In Stock?</th>
  </tr>
  {% for food in menu_list %}
  <tr>
  <tr>
      <td>{{ food.menu_item_name }}</td>
      <td>{{ food.price }}</td>
      <td>{{ food.available }}</td>
  </tr>
  {% endfor %}
</table>
{% endblock %}

Modelle unten

from django.db import models
from django.forms import DateTimeField

# Create your models here.
class Inventory(models.Model):
    ingredient_name = models.CharField(max_length=30)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    units_avail = models.IntegerField()

    def __str__(self):
        return self.ingredient_name + " avail: " + str(self.units_avail)

class MenuItem(models.Model):
    menu_item_name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.menu_item_name + " with Price: " + str(self.price)

    def available(self):
        return all(recipe_req.enough() for recipe_req in self.reciperequirement_set.all())


class RecipeRequirement(models.Model):
    ingredient = models.ForeignKey(Inventory, on_delete=models.CASCADE)
    menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    quantity = models.IntegerField()

    def __str__(self):
        return self.ingredient.ingredient_name + " in " + self.menu_item.menu_item_name

    def enough(self):
        return self.quantity <= self.ingredient.units_avail

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

    def __str__(self):
        return self.menu_item.menu_item_name + " at " + self.timestamp

URLs unten

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("inventory", views.InventoryList.as_view(), name="inventory_list"),
    path("menu", views.MenuList.as_view(), name="menu_list"),
]

Lösung

Ich könnte ein Problem sehen, Sie haben <tr>in beiden Vorlagen direkt unter der Schleife ein zusätzliches Tag geöffnet.

Denken Sie auch an ein Problem mit availableder Methode, die Sie manuell im MenuItemModell definiert haben, also habe ich sie entfernt, versuchen Sie es ohne sie.

Außerdem würde ich Ihnen empfehlen zu verwenden, context_object_namewas standardmäßig object_listso ist:

Ansichten.py

class InventoryList(ListView):
    template_name = "inventory.html"
    model = Inventory
    context_object_name="inventories"

class MenuList(ListView):
    template_name = "menu.html"
    model = MenuItem
    context_object_name="menu_list"

Inventory.html-Vorlage

{% extends './base.html' %}
{% block content %}
<h2>Inventory</h2>
<table id="inventory">
  <tr>
    <th>Ingredient</th>
    <th>Price</th>
    <th>Units Available</th>
  </tr>
  {% for ingredient in inventories %}
  <tr>
      <td>{{ ingredient.ingredient_name }}</td>
      <td>{{ ingredient.price }}</td>
      <td>{{ ingredient.units_avail }}</td>
  </tr>
  {% endfor %}
</table>
{% endblock %}
{% extends './base.html' %}
{% block content %}
<h2>Menu</h2>
<table id="menu">
  <tr>
    <th>Item</th>
    <th>Price</th>
    <th>In Stock?</th>
  </tr>
  {% for food in menu_list %}
  <tr>
      <td>{{ food.menu_item_name }}</td>
      <td>{{ food.price }}</td>
  </tr>
  {% endfor %}
</table>
{% endblock %}

Hinweis: Es wird empfohlen, /am Ende jeder Route anzugeben, dass Ihre urls.py folgendermaßen aussehen sollte:

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("inventory/", views.InventoryList.as_view(), name="inventory_list"),
    path("menu/", views.MenuList.as_view(), name="menu_list"),
]

Hinweis: Klassenbasierte Ansichten in Django erfordern, dass ihr Name als Modellname als Präfix und tatsächlicher Ansichtsname als Suffix geschrieben wird, sodass Sie ihn in InventoryListViewund MenuItemListViewvon InventoryListbzw. ändern können MenuList.


Beantwortet von –
Sunderam Dubey


Antwort geprüft von –
Clifford M. (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like