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 available
der Methode, die Sie manuell im MenuItem
Modell definiert haben, also habe ich sie entfernt, versuchen Sie es ohne sie.
Außerdem würde ich Ihnen empfehlen zu verwenden, context_object_name
was standardmäßig object_list
so 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 %}
menu.html-Vorlage
{% 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
InventoryListView
undMenuItemListView
vonbzw. ändern könnenInventoryList
.MenuList
Beantwortet von – Sunderam Dubey
Antwort geprüft von – Clifford M. (FixError Volunteer)