Django 渲染数据到模板的问题
Issue with django rendering data onto template
我正在尝试在 html 文件中呈现信息,但信息似乎没有正确显示。
在下面的 html 中,它应该呈现与其菜单标题相对应的项目。
例如
Title : Desserts
Item: Ice-cream
Description: Nice chocolate ice cream with sprinkles
$: 3.00
Title : Mains
Item: Curry
Description: Curry is hot
$: 10.00
我面临的问题是 menuitems 中的所有项目都出现在所有菜单标题下。标题呈现正常。
例如
Title : Desserts
Item: Ice-cream
Description: Nice chocolate ice cream with sprinkles
$: 3.00
Title : Mains
Item: Ice-cream
Description: Nice chocolate ice cream with sprinkles
$: 3.00
html
{% for menu in menus %}
<section id="services">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading">Title {{ menu.title }}</h2>
<hr class="primary">
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 text-center">
{% for item in menuitems %}
<p>Item {{ item.item_name }}</p>
<p>Description {{ item.description }}</p>
<p>$ {{ item.price }}</p>
{% endfor %}
</div>
</div>
</div>
</section>
{% endfor %}
如何确保信息显示在正确的标题下?
views.py
def single(request, slug):
user = request.user
restaurant = Restaurant.objects.get(slug=slug)
template = 'restaurants/single.html'
menus = restaurant.menutitle_set.all()
menuitems = MenuItem.objects.filter(title=menus)
context = {
'restaurant': restaurant,
'menus': menus,
'menuitems': menuitems,
}
return render(request, template, context)
models.py
class Restaurant(models.Model):
user = models.CharField(max_length=250)
restaurant_name = models.CharField(max_length=250)
restaurant_address1 = models.CharField(max_length=250)
restaurant_address2 = models.CharField(max_length=250)
restaurant_state = models.CharField(max_length=120, choices=STATE_CHOICES)
slug = models.SlugField(unique=True)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __unicode__(self):
return self.restaurant_name
def get_absolute_url(self):
return reverse("single_restaurant", kwargs={"slug": self.slug})
class MenuTitle(models.Model):
restaurant = models.ForeignKey(Restaurant)
title = models.CharField(max_length=120)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
active = models.BooleanField(default=True)
def __unicode__(self):
return self.title
class MenuItem(models.Model):
title = models.ForeignKey(MenuTitle)
item_name = models.CharField(max_length=2000)
description = MarkdownField(max_length=2000, null=True, blank=True)
price = models.CharField(max_length=2000)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
active = models.BooleanField(default=True)
def __unicode__(self):
return self.item_name
admin.py
class MenuTitleInline(admin.StackedInline):
model = MenuTitle
extra = 1
class MenuItemInline(admin.StackedInline):
model = MenuItem
extra = 1
class RestaurantAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("restaurant_name",)}
class Meta:
model = Restaurant
inlines = [MenuTitleInline]
admin.site.register(Restaurant, RestaurantAdmin)
class MenuTitleAdmin(admin.ModelAdmin):
list_display = ["restaurant", "title"]
class Meta:
model = MenuTitle
inlines = [MenuItemInline]
admin.site.register(MenuTitle, MenuTitleAdmin)
{% for item in menuitems %}
<p>Item {{ item.item_name }}</p>
<p>Description {{ item.description }}</p>
<p>$ {{ item.price }}</p>
{% endfor %}
将此代码更改为,
{% for item in menu.menuitem.all %}
<p>Item {{ item.item_name }}</p>
<p>Description {{ item.description }}</p>
<p>$ {{ item.price }}</p>
{% endfor %}
尝试从视图中删除 menuitems
(或者只是不将 menuitems
添加到上下文)并将 {% for item in menuitems %}
替换为 {% for item in menu.menuitem_set.all %}
。
正如@Geo Jacob 所建议的那样,进行了这些更改。同样在视图函数中,无需在上下文字典中设置 "menuitems" 变量。
我正在尝试在 html 文件中呈现信息,但信息似乎没有正确显示。
在下面的 html 中,它应该呈现与其菜单标题相对应的项目。
例如
Title : Desserts
Item: Ice-cream
Description: Nice chocolate ice cream with sprinkles
$: 3.00
Title : Mains
Item: Curry
Description: Curry is hot
$: 10.00
我面临的问题是 menuitems 中的所有项目都出现在所有菜单标题下。标题呈现正常。
例如
Title : Desserts
Item: Ice-cream
Description: Nice chocolate ice cream with sprinkles
$: 3.00
Title : Mains
Item: Ice-cream
Description: Nice chocolate ice cream with sprinkles
$: 3.00
html
{% for menu in menus %}
<section id="services">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading">Title {{ menu.title }}</h2>
<hr class="primary">
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 text-center">
{% for item in menuitems %}
<p>Item {{ item.item_name }}</p>
<p>Description {{ item.description }}</p>
<p>$ {{ item.price }}</p>
{% endfor %}
</div>
</div>
</div>
</section>
{% endfor %}
如何确保信息显示在正确的标题下?
views.py
def single(request, slug):
user = request.user
restaurant = Restaurant.objects.get(slug=slug)
template = 'restaurants/single.html'
menus = restaurant.menutitle_set.all()
menuitems = MenuItem.objects.filter(title=menus)
context = {
'restaurant': restaurant,
'menus': menus,
'menuitems': menuitems,
}
return render(request, template, context)
models.py
class Restaurant(models.Model):
user = models.CharField(max_length=250)
restaurant_name = models.CharField(max_length=250)
restaurant_address1 = models.CharField(max_length=250)
restaurant_address2 = models.CharField(max_length=250)
restaurant_state = models.CharField(max_length=120, choices=STATE_CHOICES)
slug = models.SlugField(unique=True)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __unicode__(self):
return self.restaurant_name
def get_absolute_url(self):
return reverse("single_restaurant", kwargs={"slug": self.slug})
class MenuTitle(models.Model):
restaurant = models.ForeignKey(Restaurant)
title = models.CharField(max_length=120)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
active = models.BooleanField(default=True)
def __unicode__(self):
return self.title
class MenuItem(models.Model):
title = models.ForeignKey(MenuTitle)
item_name = models.CharField(max_length=2000)
description = MarkdownField(max_length=2000, null=True, blank=True)
price = models.CharField(max_length=2000)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
active = models.BooleanField(default=True)
def __unicode__(self):
return self.item_name
admin.py
class MenuTitleInline(admin.StackedInline):
model = MenuTitle
extra = 1
class MenuItemInline(admin.StackedInline):
model = MenuItem
extra = 1
class RestaurantAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("restaurant_name",)}
class Meta:
model = Restaurant
inlines = [MenuTitleInline]
admin.site.register(Restaurant, RestaurantAdmin)
class MenuTitleAdmin(admin.ModelAdmin):
list_display = ["restaurant", "title"]
class Meta:
model = MenuTitle
inlines = [MenuItemInline]
admin.site.register(MenuTitle, MenuTitleAdmin)
{% for item in menuitems %}
<p>Item {{ item.item_name }}</p>
<p>Description {{ item.description }}</p>
<p>$ {{ item.price }}</p>
{% endfor %}
将此代码更改为,
{% for item in menu.menuitem.all %}
<p>Item {{ item.item_name }}</p>
<p>Description {{ item.description }}</p>
<p>$ {{ item.price }}</p>
{% endfor %}
尝试从视图中删除 menuitems
(或者只是不将 menuitems
添加到上下文)并将 {% for item in menuitems %}
替换为 {% for item in menu.menuitem_set.all %}
。
正如@Geo Jacob 所建议的那样,进行了这些更改。同样在视图函数中,无需在上下文字典中设置 "menuitems" 变量。