Django:呈现父对象';仅当子项的子项具有数据时,才会将数据添加到模板
这是我的模特Django:呈现父对象';仅当子项的子项具有数据时,才会将数据添加到模板,django,python-3.x,Django,Python 3.x,这是我的模特 class Category(models.Model): name = models.CharField(max_length=50) ordering_num = models.IntegerField(default=0) class Meta: ordering = ['ordering_num'] def __str__(self): return self.name class SubCategory
class Category(models.Model):
name = models.CharField(max_length=50)
ordering_num = models.IntegerField(default=0)
class Meta:
ordering = ['ordering_num']
def __str__(self):
return self.name
class SubCategory(models.Model):
category = models.ForeignKey('Category', on_delete=models.CASCADE)
name = models.CharField(max_length=50)
ordering_num = models.IntegerField(default=0)
class Meta:
ordering = ['ordering_num']
def __str__(self):
return self.name
class ProductBasicModels(models.Model):
whose = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
category = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
standard = models.CharField(max_length=50)
maker = models.CharField(max_length=50, blank=True)
outbox = models.CharField(max_length=50, blank=True)
extra = models.CharField(max_length=100, blank=True)
orderto = models.ForeignKey(OrderCompany, null=True, blank=True, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['name']
def __str__(self):
return self.name
views.py
@ login_required
def product_list(request):
categories = Category.objects.all()
context = {'categories': categories}
return render(request, 'medicalapp_1/products_h.html', context)
产品_h.html
(结构简单…)
根据我的密码。。显示的所有类别、子类别和产品。但我想让他们只显示产品模型有数据
像这样
category1
subcategory1
product1
product2
product3
category4
subcategory1
product4
product5
subcategory3
product6
(类别2,3)和(类别4的子类别2)不显示,因为它们没有产品
如何使视图中的过滤器像它一样工作?利用。无需在product\u list()
方法中获取所有类别。取而代之的是获取所有产品(顾名思义)
-使用与其外键相关的预取
,以优化查询。然后重新组合查询集。就这些
def product_list(request):
products = ProductBasicModels.objects.all().prefetch_related('category','category__category')
context = {'products': products}
return render(request, 'medicalapp_1/products_h.html', context)
然后,在模板中
{% regroup products by category.category as cats %}
{% for cat in cats %}
<br>{{cat.grouper}}
{% regroup cat.list by category as subcats %}
{% for subcat in subcats %}
<br>{{subcat.grouper}}
{% for product in subcat.list %}
<br>{{product}}
{% endfor %}
{% endfor %}
{% endfor %}
{%按类别重新组合产品。类别为cats%}
{猫中猫的百分比%}
{{cat.gropper}}
{%按类别将类别列表重新组合为子类别%}
{子类别%中的子类别为%1}
{{subcat.grouper}}
{subcat.list%中产品的%s}
{{product}}
{%endfor%}
{%endfor%}
{%endfor%}
PS:类别和子类别的两个独立(&类似)模型是冗余的,您不应该使用它。您可以只使用带有
ForeignKey
的单一型号来'self'
太好了!它很漂亮,很干净。我会根据你的建议更换型号。非常感谢你!还有一个问题。。如果我需要按子类别对显示数据进行排序,该怎么办?在那个视图中我该怎么办?我刚刚找到了过滤解决方案并应用了它。订购人(“类别订购数量”)谢谢!!
{% regroup products by category.category as cats %}
{% for cat in cats %}
<br>{{cat.grouper}}
{% regroup cat.list by category as subcats %}
{% for subcat in subcats %}
<br>{{subcat.grouper}}
{% for product in subcat.list %}
<br>{{product}}
{% endfor %}
{% endfor %}
{% endfor %}