簡體   English   中英

有沒有辦法使用 django 將外鍵與其相關的 model 隔離開來?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM