Как получить доступ к внешнему ключу в шаблоне Django? (DetailView) - PullRequest
0 голосов
/ 07 января 2019

Я хочу отобразить продукты в шаблоне Campaign DetailView.

В моем проекте в каждой кампании есть магазин, в котором есть товары, поэтому поток выглядит так:

Кампания -> Магазин -> Продукты

Campaign models.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)

DetailView

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

Template

{% 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 голосов
/ 07 января 2019

В любом случае, ваши модели ошибочны, но особенно если вы хотите использовать цикл for. Вам не нужны OneToOneFields из магазина в продукт, вам просто нужен один ключ ForeignKey из продукта в магазин.

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

Теперь вы можете сделать:

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

Если у вас вообще нет других полей в Магазине, вы можете удалить всю эту модель и указать точку ForeignKey непосредственно в Campaign, а затем выполнить итерацию по obj.product_set.all.

0 голосов
/ 07 января 2019

Поскольку они связаны с 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...