使用Django模板生成表单

时间:2015-04-08 13:32:53

标签: django django-templates

我打算以一种不太常见的方式使用Django模板系统。我需要一个能让我轻松创建简单的“填补空白”形式的应用程序,我决定使用带有自定义标签的Django模板来设计表单。

这是我的意思草图:

<p>
This is the <i>form</i>. Two plus two is {% gap four 4 vier %}.<br>
The best programming language is {% case_gap Python Haskell %}.
</p>

{% if all_correct %}
    You are smart.
{% else %}
    <input type="submit">
{% endif %}

我们的想法是*gap标记呈现文本输入控件,查看上下文以查看是否发送了答案,如果答案正确,则将文本输入标记为绿色。

问题是如何实现all_correct逻辑。简单的解决方案是将此变量添加到上下文中,然后使每个*gap标记根据其正确答案更新它,并且,我相信,这应该适用于我的示例。但是,如果我想将{% if all_correct %}代码移动到模板的顶部,而gaps没有呈现,并且因此没有人验证他们的答案呢?

看起来我需要一些方法来迭代所有*gap标签,然后才开始渲染模板并[请他们]验证答案,但我不知道模板系统的内部结构是否足够好实现这一点。或者可能存在完全不同且更好的方式。

1 个答案:

答案 0 :(得分:0)

我相信在阅读了The Django Book的Chapter 9之后,我想到了如何做到这一点。

创建自定义模板标记涉及定义两件事:如何编译标记以及如何呈现它。编译函数应解析标记数据并返回Node - 基本上是具有.render(self, context)方法的东西,以及从标记文本派生的一些其他数据。

解决方案是创建FormNode - Node的子类,它也有.validate(self, context)方法。然后我们的自定义标记将被编译为实现验证逻辑的FormNode的子类。

接下来要做的是创建FormTemplate - 具有超级能力的Template的子类:在开始渲染单个节点之前,它将通过迭代它们并调用{来验证所有节点在validate(context)的所有子类上{1}},它将在上下文中设置FormNode变量。


以下是我的概念验证实施:https://github.com/kirelagin/django-template-forms。我相信它运作得很好。

我使用了实例化Django 1.8中添加的自定义模板引擎的功能。总的来说,我不得不深入挖掘一点,我总是有这种感觉,模板API和django引擎(现在只是可用的后端之一)的分裂尚未完成。我希望Django 2.0能为我们带来新的酷炫内容,而且我必须添加的所有黑客都会消失。