在 Django 中编写模板标签

1 投票
1 回答
1140 浏览
提问于 2025-04-15 13:14

我正在尝试定制一个用Django写的内容管理系统(CMS)。因为内容编辑者的灵活性不够,所以我想找个更好的解决方案。

简单来说,我希望它能像django-better-chunks或者django-flatblocks那样。也就是说,我想在模板中设置一个可编辑的区域。我想把这些可编辑的区域和一些字符串以及对象实例结合起来。举个例子,假设有多个可编辑区域是基于同一个产品的:

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

所以如果你有一个视图,里面有另一个产品作为product_instance,那么这两个blocks就会显示不同的数据。我还觉得可以有一些全站通用的块,只传递字符串部分。总的来说,我希望能够传递从1到无穷多个的标识符。

不过我在两个方面遇到了困难:

  1. 我该如何定义混合标识符和实际内容“block”实例之间的关系?我觉得内容类型可能会涉及到,但我真不知道从哪里开始找!

  2. 我该如何写一个模板标签来读取上面的语法,并把它转换成一个可以渲染的对象呢?

1 个回答

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

撰写回答