【问题标题】:Template filter for generating product by category按类别生成产品的模板过滤器
【发布时间】:2025-12-12 19:55:02
【问题描述】:

我有一个 django 项目,我在模板中显示产品。使用某种模板过滤器按类别显示产品的最佳方式是什么。例如,如果我想按 Hovis 类别显示面包,则在模板上。此时将显示数据库中的所有产品。

            <tr>
                <td><h5>{{ product.name }}</h5></td>
                <td><p><strong>{{ product.price }}</strong></p></td>
            </tr>

Models.py 的副本(根据要求):

from django.db import models
from django.core.urlresolvers import reverse

class Category(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    # def get_absolute_url(self):
    #     return reverse('shop:product_list_by_category', args=[self.slug])

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('-created',)
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.name

    # def get_absolute_url(self):

【问题讨论】:

  • 有没有像product.type of smthing这样的产品类型?
  • 不确定你的意思,但这是一个非常简单的项目。我有两个模型,产品和类别。我只需要通过模板过滤器使用类别显示(如果可能的话)。
  • 你能发布这些模型,以便我们现在了解它们之间的关系吗?
  • 添加 models.py 代码

标签: python django django-templates django-template-filters


【解决方案1】:

我会将已经准备好的数据从视图发送到模板,以避免前端的额外逻辑。你可以在视图中做这样的事情:

products  = Product.objects.all()

all_products_by_cat ={}
for product in products:
    if all_products_by_cat.get(product.category):
        all_products_by_cat[product.category].append(product)
    else:
        all_products_by_cat[product.category] = [product]

在模板中你会这样做:

{% for product in all_products_by_cat['some_category'] %}
<!-- do something with the product-->
{% endfor %}

【讨论】:

  • 谢谢,但我得到一个解析错误:无法解析剩余部分:'['Some name']' from 'all_products_by_cat['Some name']'