我的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式的方式通过过滤器等来做。?
答案 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)