在Django中编写模板标记

时间:2009-07-29 14:12:17

标签: python django django-templates

我正在尝试自定义用Django编写的CMS。内容编辑器不够灵活,所以我试图找到一个更好的解决方案。

如果没有过度解释,我希望它有点像django-better-chunksdjango-flatblocks。您可以完全从模板中设置可编辑区域。我想将这些可编辑区域绑定到字符串和对象实例的混合。一个例子是基于一种产品具有多个可编辑区域:

{% block product_instance "title" %}
{% block product_instance "product description" %}

因此,如果您将另一个产品视为product_instance,则这两个blocks会显示不同的数据。我还会看到只有通过字符串部分才能使用站点范围的块。基本上,我希望能够传递1-infinity标识符。

但我真的在这两个方面苦苦挣扎:

  1. 如何定义混合标识符与实际内容“block”实例之间的关系?我觉得contenttypes可能会在这里出现,但我真的不知道从哪里开始寻找!

  2. 如何编写模板标签来阅读上述语法并将其转换为对象进行渲染?

1 个答案:

答案 0 :(得分:2)

为此您可以创建一个包含标记并使用它:

{% load my_tags %}
{% product bicycle <extra vars ...> %}

要定义标记,请添加到app / templatetags / mytags.py:

@register.inclusion_tag('results.html')
def product(item, *extra):
    #maybe repackage extra variables
    #and add them to the returned dictionary
    item_form = ItemForm(item) #form.ModelForm instance
    return {'item': item, 'item_form':item_form, ...}

然后你需要一个为项目返回html的模板:

<h1>{{item.title}}</h1>
{{item_form}}
... add some conditional statements depending on extra vars