这应该在视图逻辑中吗?

时间:2010-12-06 17:45:32

标签: django model-view-controller

我的Django模型有一个字段,我希望在其中有参考逻辑。举个例子:

This is an example of text in the field.[ref type="quotation" name="Martin" date="2010"]

在最终标记中显示时,将其呈现为(缩减示例):

This is an example of text in the field.<a href="#ref">1</a>
[SNIP]
<ul>
<li><a name="ref1">Martin, 2010</a></li>
</ul>

因此,基本上,我正在构建一个引用列表,以进入页面下方的另一个{{}}块。

这种文本处理逻辑是否应该在视图中(所以我将2个值传递给模板,1是修改后的文本,1是参考表),或者是否有更多Django式的方式通过过滤器等来做。?

1 个答案:

答案 0 :(得分:1)

如果您实际上将引用存储在文本字段中,例如,那么基本上您使用简单的标记语言来存储引用。

在这种情况下,我认为模板就是这样做的地方。

不幸的是,我不知道有什么方法可以让过滤器创建并写入上下文变量。因此,您不必使用过滤器,而是必须使用标签,例如:

{% output_with_references article_content myreferencesvar %}

[snip]

<ul>
{% for ref in myreferencesvar %}
<li><a name="{{ ref.id }}">{{ ref.authors }}, {{ ref.year }}</a></li>
{% endif %}
</ul>

BTW:如果 是一种在使用过滤器时写入页面上下文的方法,我很想知道它。

更新

要实现它,你可以使用类似的东西:

from django.template import Library, Node, TemplateSyntaxError

register = Library()

class OutputWithReferencesNode(Node):
    def __init__(self, input, ref_varnam='references'):
        self.input = input
        self.ref_varnam=ref_varnam

    def render(self, context):
        output = self.input
        references = []
        # process self.input
        context[self.ref_varnam] = references
        return output

@register.tag
def output_with_references(parser, token):
    try:
        fnctn, input, ref_varname = token.split_contents()
    except ValueError:
        raise TemplateSyntaxError, "%s takes the syntax %s text_to_output references_variable_name" % (fnctn,)
    return OutputWithReferencesNode(input, ref_varname)