请教一个 Django 模板中用变量作为 key 取得 dict 值的问题。 - V2EX
shinwood

请教一个 Django 模板中用变量作为 key 取得 dict 值的问题。

  •  
  •   shinwood
    shinwood Apr 24, 2013 21670 views
    This topic created in 4771 days ago, the information mentioned may be changed or developed.
    假设views.py有一个dict
    a = {'today':1, 'tomorrow':2, 'yesterday':3}

    在板中,这样是无法得到值的,会显示空白:
    {% for k,v in a.items%}
    {{a.k}}
    {% endfor %}

    即对于k 的解析并不会视 key 为一个变量,而是视为一个字母k(非a.today 等),这部分有没有比较好的最佳实践解决办法?查了一下网上资料,有人说自己写一个filter,有人说换用Jinja2 或者Mako,但我觉得都比较麻烦,不像最佳方法。
    Supplement 1    Apr 29, 2013
    更新一下进度:

    最后还是用 template filter 解决的,可参考以下链接:

    https://docs.djangoproject.com/en/dev/howto/custom-template-tags/
    17 replies    2016-06-01 21:42:50 +08:00
    swulling
        1
    swulling  
       Apr 24, 2013
    访问字典不是 a[k]
    django 的template没用过,连这个也不允许么
    hzymyp
        2
    hzymyp  
       Apr 24, 2013   1
    {% endfor %}
    {% for k, v in time.items%}
    {{k}}
    {% endfor %}
    这样写是能得到的啊
    hzymyp
        3
    hzymyp  
       Apr 24, 2013   1
    忽略第一个endfor。。。
    shinwood
        4
    shinwood  
    OP
       Apr 24, 2013
    @swulling 不好意思,我举例可能有疏忽,我现实的场景是一个object,类似于这样
    a = {'today':<object1>, 'tomorrow':<object2>, 'yesterday':<object3>}

    然后用 v.val 之类的模板当中无法获得object 的属性值。


    @hzymyp 对,这样可以获得。我举例子中因为只有一个a,若是有一个b的dict的话,我要从a循环中得到b里面的值,就要用到 a.k 或者 a[k] (视a中元素的类型而定),这样子在模板中是无法得到值的,可以尝试一下看看。
    kidblg
        5
    kidblg  
       Apr 24, 2013   1
    swulling
        6
    swulling  
       Apr 24, 2013   1
    @shinwood 我想起来了,django的template比较严格,很久之前用过,很不爽。其实你可以考虑用其他的模版系统。比如Jinjia2
    yinian1992
        7
    yinian1992  
       Apr 24, 2013
    你都已经获得 value 了还要 key 取 value 干吗?
    shinwood
        8
    shinwood  
    OP
       Apr 24, 2013
    @yinian1992 设想我有两个dict:

    a = {'today':1, 'tomorrow':2, 'yesterday':3}
    b = {'today':1, 'yesterday':3}

    设想我要交叉一下

    for k,v in b.items():
    print a[k]

    类似于这种功能。
    yinian1992
        9
    yinian1992  
       Apr 24, 2013   1
    @shinwood 用 dot 必然是实现不了了
    看我的 O(n^2) 实现:

    {% for ak,av in a.iteritems %}
    {% for bk,bv in b.iteritems %}
    {% if ak == bk %}
    {{ bv }}
    {% endif %}
    {% endfor %}
    {% endfor %}
    shinwood
        10
    shinwood  
    OP
       Apr 24, 2013
    @yinian1992 233,这也可以!!感谢提供不错的思路,就是不知道如果量多的话效率如何?
    yinian1992
        11
    yinian1992  
       Apr 24, 2013
    @shinwood 一定效率捉急……
    ant_sz
        12
    ant_sz  
       Apr 25, 2013   1
    我再添一句
    像这样的功能原则上是应该放到 Controller 里的,不应该放到 View 里
    在Controller里建立一个 c 字典,然后用a的key把b的值取出来放到c里
    然后在模板里只引用c

    这样是比较符合MVC模式的实现方式
    shinwood
        13
    shinwood  
    OP
       Apr 25, 2013
    @ant_sz 原则上是如此,不过这样一来 view.py 当中的代码量就过于冗余了,django 模板的确失去了不少的灵活定制性。view 中可以不进行 db 操作,但我觉得像这样数组的操作还是很有必要的。
    davidzhang
        14
    davidzhang  
       Jan 22, 2014
    {% for k, v in time.items%}
    {{k}}
    {% endfor %}
    这样写是能得到的啊
    shinwood
        15
    shinwood  
    OP
       Jan 22, 2014
    @davidzhang 对,这是对于 time 这个对象当中的可以得到,如果我现在有一个 b 对象,我要得到 b.k 的值呢?
    HanSonJ
        16
    HanSonJ  
       Jan 21, 2016
    好久的贴,但想问问楼主的解决方案有没有案例?
    chrysan
        17
    chrysan  
       Jun 1, 2016
    @hzymyp 多年后还看到当初的解决方案,临时用一下。不过 tag 和 filter 的解决方案还是没有思路!
    About     Help     Advertise     Blog     API     FAQ     Solana     2952 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 06:10 PVG 14:10 LAX 23:10 JFK 02:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86