Как отобразить товары в дочернем цикле, связанные с товарами в основном цикле с помощью django?

  • В основном цикле отображается карточка товара (B, C, D...), связанная по бренду (или категории) с товаром A.
  • В карточке товара B, C, D.... То есть, подконтур, показывающий до 3 товаров с той же (точной) моделью, что и товар B, C, D...

Есть ли способ сделать это для DetailView. Я также хочу применить это к тегам на странице категории (ListView).

Код в родительском цикле работает нормально, однако код в дочернем цикле работает неправильно.

Мои коды следующие (код сокращен):

Models.py

class Modelp(models.Model):
    name=models.CharField(max_length=100, blank=True, null=True,)
    slug = AutoSlugField(max_length=100, populate_from='name')

    class Meta:
        verbose_name_plural='Models'

    def __str__(self):
        return self.name

class Product(models.Model):
    title = models.CharField(
        verbose_name=_("title"),
        help_text=_("Required"),
        max_length=200
        )
    slug = models.SlugField(max_length=200, unique=True)
    modelp=models.ForeignKey(Modelp, blank=True, null=True, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.RESTRICT)
    brand = models.ForeignKey(Brand, blank=True, null=True, on_delete=models.CASCADE)
    store = models.ForeignKey(Store, null=True, blank=True, on_delete=models.CASCADE)
    popularity = models.IntegerField(verbose_name=_("Popularity"), default=0)

    class Meta:
        verbose_name = _("Product")
        verbose_name_plural = _("Products")

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('product-detail', kwargs={'slug': self.slug})

views.py

class ProductDetailView(DetailView):
    template_name = 'product_detail.html'
    model = Product

    def get_template_names(self):
        if self.request.htmx:
            return 'product/all_variations.html'
        return 'product_detail.html'

    def get_context_data(self, **kwargs):
        context = super(ProductDetailView, self).get_context_data(**kwargs)
        context_related_brand = Product.objects.filter(brand=self.object.brand).exclude(
            slug=self.kwargs['slug'])[:6]
        context_related_modelp = Product.objects.filter(modelp=self.object.modelp).exclude(
            slug=self.kwargs['slug'])[:3]
        context_related_category = Product.objects.filter(category=self.object.category).exclude(
            slug=self.kwargs['slug']).order_by('popularity')[:6]

        context['category'] = Category.objects.all()
        context['related_p_b'] = context_related_brand
        context['modelp'] = context_related_modelp

        return context

urls.py

path("product/<slug:slug>", ProductDetailView.as_view(), name="product-detail"),

product_detail.html


<h1>{{object.title}}</h1>

<ul>
    {# Related products of the same brand #}
    {% for pro in related_p_b %}
    <li>
       {{ pro.title }} | model: {{ pro.modelp }} | brand: {{ pro.brand.name }}
        <ul>
            {# The product has the same model as the related product #}
            {% for product in modelp %}
            <li>{{ product.name }} | model: {{ product.modelp }}</li>
            {% endfor %}
        </ul>
    </li>
    {% endfor %}
</ul>
Вернуться на верх