Django模板按“不相关”模型的字段排序
Posted
技术标签:
【中文标题】Django模板按“不相关”模型的字段排序【英文标题】:Django template sort by 'unrelated' model's field 【发布时间】:2015-02-18 10:20:28 【问题描述】:我正在尝试通过模型中的一个字段对模板中的相关项目进行排序,这三个 ForeignKey 关系相距甚远。我正在按照另一个 *** 答案中的建议在视图中组装模板的数据:
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))
正如我所说,模板和视图几乎是上述 *** 文章中提出的解决方案的副本。我觉得很好奇的一件事是视图中的 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"
从那里我们遵循“家庭”字段到 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)
最后,我们使用“订单”字段进入模型,我们希望通过 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】:模板中有两个错误。
首先,您已将具有排序关系的项目放在名为itemCollection
的列表中,但在模板中您将迭代cart_item
。这是一个很好的例子,说明为什么你应该明确传递给模板的变量,而不是依赖于locals()
。
其次,您然后迭代 part_list
而不定义它。你的意思是item.part_list
。
【讨论】:
以上是关于Django模板按“不相关”模型的字段排序的主要内容,如果未能解决你的问题,请参考以下文章
请问django如何将字符型字段按数值型排序,如‘12,123,1111,133’,排序后结果为12,123,133,1111,在线等