Django +装饰器:根据标准向模板添加上下文

时间:2010-01-18 20:47:33

标签: django decorator

我不确定装饰器是否是最好的方法,但我已经删除了使用上下文处理器的想法,我不确定中间件是否是我想要的。

我的情况如下:我们每天处理销售和其他数据。每个月,我们都会像其他任何业务一样关闭这个月。我们在纸上这样做,但我想对我们的系统应用相同的东西。所以基本上,如果数据只读,如果它在关闭的关闭日期内。

我很容易想出如何在处理/后端方面做到这一点,但是如何在不编辑大量视图功能的情况下将这样的上下文传递给模板?我只是想将一个装饰器传递给我的函数,这些函数将测试传递的实例的日期并向模板添加一些上下文,这样我就可以显示一条消息,让用户知道为什么“保存”按钮被消隐了。

我希望我的问题有道理。提前谢谢。

1 个答案:

答案 0 :(得分:4)

我会使用自定义模板标记。它使得设置上下文变量变得非常容易

#yourapp/templatetags/business_tags.py

from django import template
register = template.Library()

class BusinessNode(template.Node):
  def __init__(self, instance, varName):
    self.instance, self.varName=instance, varName

  def render(self, context):
    instance=template.Variable(self.instance).render(context)
    if instance.passes_some_test():
      context[self.varName]='Some message'
    else:
      context[self.varName]="Some other message"
    return ''
@register.tag
def business_check(parser, token):
  bits=token.split_contents()
  if len(bits)==5:
    return BusinessNode(bits[2],bits[4])
  return ''

然后在你的模板中

{% load business_tags %}

{% business_check for someVar as myMessage %}
{{myMessage}}

这同样适用于将其他类型的数据插入上下文。