繁体   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