Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django :模板字典/对象交叉引用

Django :模板字典/对象交叉引用
EN

Stack Overflow用户
提问于 2011-08-07 11:49:23
回答 3查看 888关注 0票数 1

在Django中,模板变量中的点在理论上表示基于以下分辨率的查找:

  • 查字典。示例:foo["bar"]
  • 属性查找示例:foo.bar
  • 方法呼叫。示例:foo.bar()
  • 列表索引查找。示例:foo[bar]

来自在django 1.2中呈现上下文 (docs.djangoproject.com)。

在现实中:

视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
class Veggie(object):
    def __init__(self, name):
        self.name = name
veggies = {'a': Veggie('carrot'), 'b': Veggie('lettuce')}

basket = ['a', 'c', 'b']

return render_to_response('tpls/veggies.txt', 
        {'veggies': veggies, 'basket': basket},
        mimetype="text/plain")

模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Veggie by basket order, showing name

{% for veg in basket %}
    {{ veg }}
    {{ veggies.veg.name }}
{% endfor %}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Veggie by basket order, showing name

    a

    c

    b

输出中没有素食主义者的名字。

我想这不是Django说的。我很感激我可以,一个la Peter Harkins "Django字典访问模板标签“,写一个标签来解决这个问题。太丑了。

按照姜戈票12486的说法,这对Django团队来说是一个否定的解决方案,因为“目的是让非程序员可以读写Django的模板,所以复杂的逻辑应该是查看代码或自定义模板标记。”(路克植物)

对于在这种情况下编写可阅读的模板代码,我将非常感激(我有很多不同种类的“蔬菜”要删除)。如果我们有模板作者知道如何进行字典查找,那么离开Django值得吗?

EN

回答 3

Stack Overflow用户

发布于 2011-08-07 13:43:04

Django的模板引擎将for循环中的veg作为字符串处理,但您正在尝试将其用作表达式的一部分。尽管Django的模板引擎有时是一个障碍,但您所做的只是无法验证。您想要做的是获取veggies的属性,其名称包含在对象veg中,而点表示法在veg或Django的模板中都不能这样工作。当您说veggies.veg时,它是在蔬菜上寻找一个名为veg的属性,而不是abc。这不是Django模板引擎的缺陷;这正是Python (以及我所知道的每一种语言)的工作方式。

相反,只需吸收它并编写一个模板标记来访问任意对象的属性(按名称),或者传递模板--一个不需要模板中的逻辑的篮子。

票数 2
EN

Stack Overflow用户

发布于 2011-08-07 13:48:10

这样做的方法是准备在视图中呈现的数据结构(我认为这是为什么Django中的" view“称为"view”的原因之一)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
basket = [veggies[veg_id] for veg_id in basket_id_list]

然后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% for veg in basket %}
    {{ veg.name }}
{% endfor %}

所以,通过你想要渲染的结构,而不是你得到的结构。django并不认为模板编写人员无法理解字典查找(或者是一些python代码),django认为变量字典查找(以及任意python代码)对于模板逻辑来说太复杂了,这是有原因的。我个人认为你的模板代码片段不太容易读,但这是个人偏好。

如果您不同意这种思想,或者它限制了您的任务,那么就很容易使用模板过滤器(无论如何都无法区分带有点语法的dctvar和dct‘’var‘,而且过滤器只是一行,在django本身中使用它是没有好处的),或者,如果这种思想非常恶心,就切换到另一个模板引擎,比如jinja2。

票数 1
EN

Stack Overflow用户

发布于 2011-08-07 12:06:28

Django阻止您在模板中快速攻击以解决您的问题,因为它强制模板作者和视图作者之间进行分离。假设您出售了10,000种不同的蔬菜,并将它们保存在数据库表中。你真的想把一本所有10,000种蔬菜的字典传递到模板中来启用你描述的内容吗?

如果您使用实际的模型而不是类和字典来构建这个示例,那么您可能已经得到了您想要的东西:“购物篮”将是一个带有外键引用" Veggie“的对象,因此basket_item.veggie将引用Veggie表中的一行(嗯,不打算使用双关语)。您可以简单地传递到篮中,当从模板引用时,将根据需要填充素食项。为了提高效率,您最终可能会在获取购物篮项以在单个SQL查询中预先填充素食项时使用.select_related

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6975359

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文