实在忍不住了,为什么 Django Template 中不能 call function 。这样导致用后台 filter 代码生成 html pieces 更加混乱了

2014-08-03 17:49:47 +08:00
 trendzi
实在忍不住了,为什么Django Template中不能call function 。这样导致用后台filter代码生成html pieces 更加混乱了


首先,我知道可以用tags和filter解决下面的问题,后果是让我把html代码放到了tag or filter里,混乱不堪。

====================
问题描述:
1、可以用cates_obj=Cates.objects.all()获得第一层循环所需要的 category 列表
2、我想在template中,for each 第一层的 category 列表,然后根据 每个 category 的名字 , 获取第二个列表。然后再foreach 显示第二个列表,就这么简单。


效果图如下:

=category A
----cat_a_1_sublist
----cat_a_2_sublist
----cat_a_3_sublist
=category B
----cat_b_1_sublist
----cat_b_2_sublist
----cat_b_3_sublist
=category C
----cat_c_1_sublist
----cat_c_2_sublist
----cat_c_3_sublist


===================

我现在的方案:

cates_obj_=Cates.objects.all()
list_dict={} # 这是一个dict,key是category的名字
for cat in cates_obj:
list_dict[cat.name]=List.objects.all(cat_name=cat.name)

然后把:
cates_obj和list_dict分别放到context,给template使用。

=================
template里:

{% for cat in cates_obj %}
#怎么才能在list_dict中取出当前的 cat.name 中的内容呢?
{% endfor%}




感觉Django 不让template call function ,是不可思议的决定。

大家觉得呢?

实在忍不住来这里吐槽了,同时希望知道大家的解决方案。
3433 次点击
所在节点    Python
5 条回复
ahcat
2014-08-03 18:08:08 +08:00
楼主这么用django,才不可思议吧。。。

我觉得最简单的就是:给Cates类增加一个方法:

def xxxlist(self):
return List.objects.filter(cat_name=self.name).all()

在模板中调用的时候:

{% for cat in cates_obj %}
{% for xxxlist in cat.xxxlist %}

{% endfor %}
{% endfor%}
est
2014-08-03 18:08:42 +08:00
django的理念是,如果你需要在模板里call function为毛不去写php。所有功能模板里就call完了。

LZ你的方法是标准方法,如果实在需要在django里实现这个逻辑,可以给model 写个method,比如


class Cates(models.Model):
# .... 省略
def get_sub_cat (self): return ['blah']

然后django模板里
{% for subcat in cat.get_sub_cat %}
ahcat
2014-08-03 18:13:51 +08:00
还有我觉得楼主这种中英文混搭的表达方式很难理解。

今天我open了一个case,小王你follow一下。
trendzi
2014-08-03 19:31:02 +08:00
@est @ahcat

多谢两位,感谢已经发送。

我的Django还在积累经验中,正在打怪升级....

我让帖子下沉吧
wangyongbo
2014-08-04 16:58:37 +08:00
{
"list_dict" : {x.name : List.objects.all(cat_name=cat.name) for x in Cates.objects.all()
}

{% for k, v in list_dict.items %}
{{ k }}<br>
{% for x in v %}
{{ x }}
{% endfor %}
<br>
{% endfor %}

你觉得这样可以满足要求吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/125907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX