代码之家  ›  专栏  ›  技术社区  ›  Bartek

Django+装饰:根据条件向模板添加上下文

  •  1
  • Bartek  · 技术社区  · 14 年前

    我不确定装饰器是否是实现这一点的最佳方法,但我已经消除了使用上下文处理器的想法,也不确定中间件是否是我想要的。

    我的情况是:我们每天处理销售和其他数据。每个月,我们都会像处理其他事务一样休一个月假。我们在纸上做这个,但是我想把同样的事情应用到我们的系统中。所以基本上,做数据 只读的 如果在关闭日期内。

    我很容易就知道如何在处理/后端进行此操作,但是如何在不编辑大量视图函数的情况下将这样的上下文传递给模板?我只想将一个修饰器传递给我的函数,该函数将测试正在传递的实例的日期,并将一些上下文添加到模板中,这样我就可以显示一条小消息,让用户知道为什么“保存”按钮是空白的。

    我希望我的问题有道理。事先谢谢。

    1 回复  |  直到 14 年前
        1
  •  4
  •   czarchaic    14 年前

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

    #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}}
    

    这对于将其他类型的数据插入到上下文中同样有效。