[英]Is there a way to isolate a foreign key from its related model using django?
我正在构建一个 django 网站,用于显示商店中商品的价格。 每个项目都属于一个类别,因此我要求类别可以包含一个或多个项目的外键。
`class Category(models.Model):
category = models.CharField(max_length=64)
def __str__(self):
return self.category
class ShopItem(models.Model):
itemName = models.CharField(max_length=64)
price = models.IntegerField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
def __str__(self):
return self.itemName`
但是在html中,我无法同时获取类别和店铺商品
我尝试了以下...
`---剪断---
{% used_category = [] %}
{% for item in shopitem_list %}
{% if item.category not in used_category %}
<tr>
<td>item.category</td>
<td></td>
<td></td>
</tr>
<tr>
{% for rel_item in shopitem_list %}
{% if rel_item.category == item.category %}
<td></td>
<td>rel_item.itemName</td>
<td>rel_item.category</td>
{% endif %}
{% enfor %}
</tr>
{% endif %}
{% endfor %}`
我希望这会帮助我创建一个表格,其中所有项目都在各自的类别下排序,但我得到了一个错误:
TemplateSyntaxError at / 第 18 行的块标记无效:“used_category”,应为“endblock”。 您是否忘记注册或加载此标签?
您无法在模板中创建和更新列表,但您可以在视图 function 中准备数据,然后以不同的方式迭代您的项目。
首先确保类别在您的模板上下文中。 为避免 n+1 查询,还预取相关项。 假设您的视图如下所示(已更新):
from django.shortcuts import render
from .models import Category
def items_list(request):
context = {
"categories": Category.objects.exclude(shop_items=None).prefetch_related(
"shop_items"
)
}
return render(request, "my_template.html", context)
然后在模板中迭代类别:
{% for category in categories %}
<tr>
<td colspan="3">{{ category.category }}</td>
</tr>
<tr>
{% for item in category.shop_items %}
<td></td>
<td>{{ item.itemName }}</td>
<td>{{ item.price }}</td>
{% enfor %}
</tr>
{% endfor %}
注意相关名称shop_items
在这里可能不起作用。 为确保它确实如此,您可以在外键上手动设置 related_name。 同时我建议将itemName
更改为name
:
class ShopItem(models.Model):
name = models.CharField(max_length=64)
price = models.IntegerField()
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="shop_items")
def __str__(self):
return self.name
您需要创建一个视图 function,它将所需的模型信息传递给模板,从而完成 django 在其上运行的 Model - 视图 - 模板 (MVT) 方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.