在Django中从数据库渲染自定义模板标记

时间:2013-01-04 03:43:07

标签: python django django-templates

我是Django的新手,我正在尝试为我的网站构建一个博客应用程序。我有一个我创建的模型来存储博客帖子,其中包括帖子正文的文本字段,使用TinyMCE创建并转换为HTML(通过Grappelli)。我希望在此帖子正文中嵌入自定义模板标记,这些标记作为模板标记保存在数据库中,但在我的网站上请求时呈现为HTML。到目前为止,我没有运气让标签正确呈现。如何让Django在我的帖子中正确解释和呈现模板标签?自定义标签在加载并直接在模板中实现时工作正常,只是这种间接加载给我带来了麻烦。我试过this snippet here编辑:它有效,我做错了!),但它无法正常工作。

以下是我的观点:

from django.shortcuts import render_to_response
from myproject.apps.blog.models import Post

def blog_detail_view(request, year, month, day, slug):
    selected_post = Post.objects.get(status=1, pub_date__year = year, pub_date__month = time.strptime(month, "%b")[1], pub_date__day = day, slug = slug)
    return render_to_response('blog/detail.html', locals())

我的模板的相关部分:

...
{% load my_custom_tag %}

<div class="entry">
    {{ selected_post.body|safe }}
</div>
...

以下是保存到Post.body的文字示例:

My first paragraph.
{% my_custom_tag var1 var2 %}
My second paragraph.

目前,这将呈现为:

<p>My first paragraph.</p>
<p>{% my_custom_tag var1 var2 %}</p>
<p>My second paragraph.</p>

当我想要这样的事情时:

<p>My first paragraph.</p>
<p><a href="var1"><img src="var2"></a></p>
<p>My second paragraph.</p>

2 个答案:

答案 0 :(得分:3)

事实证明render_as_template标签找到here有效,我只是误解了它。初学者的错误。在我自己无法获取的代码段文档中没有指定两件事。

因此,您将render_as_template标记放在模板中,如下所示:

{% load render_as_template %}
{% render_as_template myobject.attribute %}

因此允许呈现myobject.attribute内的任何模板标签。这是我遇到麻烦的地方:

首先,我将帖子正文传递给render_as_template selected_post.body|truncatewords_html:"100"|safeselected_post.body|safe。模板标记无法处理属性上的过滤器,似乎将它们解释为对象名称的一部分。由于此对象不存在,因此不会呈现任何内容。我的模板需要的是:

{% autoescape off %}
{% filter truncatewords_html:"100" %}
{% render_as_template selected_post.body %}
{% endfilter %}
{% endautoescape %}

其次,如果我的帖子内容是:

My first paragraph.
{% my_custom_tag var1 var2 %}
My second paragraph.

然后为了解释my_custom_tag,我需要添加到我的帖子中:

{% load my_custom_tag %}

现在它完美无缺!

答案 1 :(得分:0)

要在Django中创建自定义标签,您需要编写标签功能然后注册它。 Link to Official Django Docs on the subject.