[英]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.