如何在Django模板中访问外键? (详细视图)

时间:2019-01-07 06:51:49

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

我想在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)

商店模型。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)

DetailView

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>

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

2 个答案:

答案 0 :(得分:1)

由于它们与OneToOneField相关联,因此您可以从广告系列详细信息视图访问商店的值,如下所示:

{{ 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 }}

更新

好吧,在这种情况下,我建议使用产品与商店之间的ManyToMany关系。因此,可以将一个产品分配给多个商店,也可以将一个商店分配给多个产品。然后,您可以定义如下关系:

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

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

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

答案 1 :(得分:0)

您的模型仍然是错误的,但是特别是如果您要使用for循环。您不需要从商店到产品的OneToOneFields,只需要从产品到商店的一个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