我有一个已排序的 QuerySet 我通过 dict 传递给模板。我需要通过 dict 维护 QuerySet 排序顺序,以动态填充表格。
我试图通过This Answer建议的嵌套列表来解决此问题。我已使用This Suggestion附加此解决方案。
Apache2重新启动后 - 表的第一次加载具有正确的排序。点击刷新后,排序就会中断。我可以多次单击刷新并最终获得排序,但是......另一个Apache重新启动会将排序顺序重置为预期。
任何人都可以帮助我吗? THX。
更新
请注意finished_case
是外键。 finished_case
还会继承Meta
类属性ordering = ['name']
。但我也明确地.order_by('finished_case__name')
。
views.url:
def caseindex(request):
qtylist = caseStockOnHand(request)
srtd = sorted(qtylist.items(), key=lambda item: item[0])
context = {'qtyonhand':srtd}
return render(request,'box_inv/caseindex.html', context)
methods.url:
def caseStockOnHand(request):
s = stocktake.objects.filter(stocktake_type__name='Case').latest('date')
c = caselog.objects.filter(date__gte=s.date)
sd = stocktake_detail_case.objects.filter(stocktake=s).order_by('finished_case__name')
qtylist = {}
#Get Stocktake Qty
for x in sd:
qtylist[x.finished_case] = x.qty
return qtylist
template.html :
{% for x, y in qtyonhand %}
{% if y > 0 %}
<tr class = {% cycle 'row1' 'row2' %}>
<td>{{x}}</td>
<td>{{y}}</td>
</tr>
{% endif %}
{% endfor %}
另外,我在Debian Wheezy 7.5上使用django 1.5,python 2.7,mysql 5.5和带有mod_wsgi的Apache 2.2。
答案 0 :(得分:1)
您的示例显然不代表您的代码,因为您使用字符串作为字典键,并且在您的代码中说它们不是字符串,而是查询集。尝试在没有实际代码的情况下回答:您使用查询集作为字典键,并且它们的哈希值(可能是从其内存地址生成)用于对最终列表进行排序。查询集没有有意义的排序,因此每次重新加载后您可能会看到不同的结果。相反,您需要使用查询集内容进行排序。
修改:替换
qtylist[x.finished_case] = x.qty
使用:
qtylist[x.finished_case.name] = x.qty
以前的键是finished_case对象,它们没有有意义的排序。后者是字符串,具有您想要的顺序。
替代方法:删除字典和排序。代码变为:
qtylist = []
for x in sd:
qtylist.append((x.finished_case.name, x.qty))
return qtylist