【问题标题】:How to access foreign key in a django template? (DetailView)如何在 django 模板中访问外键? (详细视图)
【发布时间】:2019-06-01 20:10:22
【问题描述】:

我想在 Campaign DetailView 模板中显示产品。

在我的项目中,每个广告系列都有一个包含产品的商店,所以流程就像,

活动 --> 商店 --> 产品

广告系列模型.py

class Campaign(models.Model):
     team = models.OneToOneField(Team, related_name='campaigns', on_delete=models.CASCADE, null=True, blank=True)
     shop = models.OneToOneField(shop_models.Shop, on_delete=models.CASCADE, null=True, blank=True)

购买 models.py

class Product(models.Model):
     title =         models.CharField(max_length=100)
     description =   models.CharField(max_length=700, null=True, blank=True)
     price  =        models.DecimalField(max_digits=10, decimal_places=0)

class Shop(models.Model):
     product  =  models.OneToOneField(Product, related_name='shop_product', on_delete=models.CASCADE, null=True, blank=True)
     product2 =  models.OneToOneField(Product, related_name='shop_product2', on_delete=models.CASCADE, null=True, blank=True)
     product3 =  models.OneToOneField(Product, related_name='shop_product3', on_delete=models.CASCADE, null=True, blank=True)

详细视图

class CampaignDetail(DetailView):
    model = Campaign
    form_class = CampaignForm
    pk_url_kwarg = 'pk'
    context_object_name = 'object'
    template_name = 'campaign_detail.html'

模板

{% for item in obj.shop_set.all %}
        <div class="plan">
            <a href="">

                <h4>{{ item.title }}</h4>
                <h5>{{ item.price }}</h5>
                <img src="{{ item.image.url }}" alt="">

            </a>
        </div>

模板中的字段为空。 任何帮助将不胜感激。

【问题讨论】:

  • 您可以为您的视图添加此模板的代码吗?
  • 在您看来,查询集中可能需要prefetch_related('shop_set')。你能在view.py中显示代码吗?
  • 问题已更新。

标签: django python-3.x django-models django-templates


【解决方案1】:

由于它们通过OneToOneField 关联,因此您可以像这样从广告系列详细信息视图中访问 shop 的值:

{{ obj.shop }}

如果您想访问产品,请这样做:

{{ obj.shop.product.title }}
{{ obj.shop.product.price }}

{{ obj.shop.product2.title }}
{{ obj.shop.product2.price }}

{{ obj.shop.product3.title }}
{{ obj.shop.product3.price }}

更新

好吧,在这种情况下,我建议在 Product 和 Shop 之间使用 ManyToMany 关系。这样,一个产品可以分配给多个商店,或者一个商店可以分配给多个产品。然后你可以像这样定义关系:

class Shop(models.Model):
    products = models.ManyToManyField(Product)

如果您想遍历商店的产品,您可以这样做:

{% for product in obj.shop.products.all %}
      {{ product.title }}
      {{ product.name }}
{% endfor %}

【讨论】:

  • 是的,我知道这一点,但我想使用 for 循环添加产品。
【解决方案2】:

无论如何,您的模型都是错误的,尤其是如果您想使用 for 循环。您不需要从 Shop 到 Product 的 OneToOneFields,您只需要从 Product 到 Shop 的 ForeignKey。

class Product(models.Model):
    shop = models.ForeignKey('Shop')

现在你可以这样做了:

{% for product in obj.shop.product_set.all %}
    {{ product.title }}
    {{ product.price }}
{% endfor %}

如果您在 Shop 上根本没有任何其他字段,那么您可以删除整个模型并将 ForeignKey 直接指向 Campaign,然后迭代 obj.product_set.all

【讨论】:

    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2019-02-22
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多