Как отобразить товары в дочернем цикле, связанные с товарами в основном цикле с помощью 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>