Django模板按'无关'模型的字段排序

时间:2014-12-19 13:02:28

标签: python django sorting

我正在尝试通过模型中的三个ForeignKey关系中的字段对模板中的相关项进行排序。我正在另一个StackOverflow答案中提出的视图中为模板组装数据:

Sorting related items in a Django template

据我所知,除非我必须更改变量名称,否则我会按原样复制代码。它不会抛出错误,它只会在HTML无序列表中显示没有列表项。

# checkout.html

{% for item in cart_items %}
    <tr>
        <td class="left">
        {{ item.name }}
        <ul>
        {% for part in part_list %}
            <li>{{ part.name }}
        {% endfor %}
        </ul></td>
    </tr>
{% endfor %}

观点......

# views.py

def checkout(request):
    cart_items = get_cart_items(request)

    itemCollection = []   
    for item in cart_items:
       item.part_list = item.product.buildpart.all().order_by('product__family__type')
       itemCollection.append(item)

    return render(request, 'checkout.html', locals())

get_cart_items函数:

# cart.py

def get_cart_items(request):
    """ return all items from the current user's cart """
    return CartItem.objects.filter(cart_id=get_cart_id(request))

正如我所说,模板和视图几乎是上述StackOverflow文章中提供的解决方案的副本。我认为奇怪的一件事是视图中的itemCollection []从未在模板中引用。

我认为order_by子句('product__family__type')是正确的,因为它不会产生错误。但是如果问题或其中的一部分是我试图在order_by子句中导航的模型链:

我们从购物车模型(CartItem)开始:

class Item(models.Model):
    cart_id = models.CharField(max_length=50)
    quantity = models.IntegerField(default=1)
    product = models.ForeignKey(PartModel, unique=False)

    class Meta:
        abstract = True

class CartItem(Item):
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['date_added']
        verbose_name = "Cart Item"

通过“产品”字段,我们可以访问包含我们的库存及其自引用BuildPart ManyToMany模型的模型:

class PartModel(models.Model):
    family = models.ForeignKey(PartFamily)
    name = models.CharField("Model Name", max_length=50, unique=True)
    buildpart = models.ManyToManyField('self', through='BuildPart',
                                symmetrical=False, related_name='+')

class Build(models.Model):
    build = models.ForeignKey(PartModel, related_name='+')
    part = models.ForeignKey(PartModel, related_name='+')
    quantity = models.PositiveSmallIntegerField(default=1)

    class Meta:
        abstract = True
        unique_together = ('build', 'part')

    def __unicode__(self):
        return self.build.name + ' with ' + str(self.quantity) + ' * ' + \
               self.part.family.make.name + ' ' + self.part.name

class BuildPart(Build):
    pass

    class Meta:
        verbose_name = "Build Part"

从那里我们遵循'family'字段到PartFamily模型:

class PartFamily(models.Model):
    make = models.ForeignKey(PartMake)
    type = models.ForeignKey(PartType)
    name = models.CharField("Family Name", max_length=30,
                             unique=True)
    slug = models.SlugField(unique=True)

最后,我们使用'order'字段进入模型,我们希望按相关项排序,PartType:

class PartType(models.Model):
    name = models.CharField("Part Type", max_length=30, unique=True)
    slug = models.SlugField(unique=True)
    order = models.PositiveSmallIntegerField()
    description = models.TextField(blank=True, null=True)

总结一下,如何获取购物车产品的相关项目,并按PartType模型中的“订单”字段对其进行排序?

1 个答案:

答案 0 :(得分:1)

模板中有两个错误。

首先,您已将具有已排序关系的项目放在名为itemCollection的列表中,但在模板中,您将迭代cart_item。这是一个很好的例子,说明为什么你应该明确传递给模板的变量,而不是依赖locals()

其次,然后迭代part_list而不定义它。你的意思是item.part_list