Django:阻止模板使用模型方法

时间:2014-02-11 19:23:13

标签: django

我有一个看起来像这样的Django应用程序:

class Server(models.Model):
    hostname = models.CharField(max_length=100)
    # this field stores encrypted credentials
    admin_credentials = models.TextField()

    def get_admin_credentials(self):
        return decrypt(self.admin_credentials)

由于Django的模板语言允许模板调用其上下文变量的方法(不需要参数),因此模板通过包含以下代码来泄漏这些凭证似乎太容易了:

{{ server.get_admin_credentials }}

如何阻止模板直接使用get_admin_credentials()方法?

1 个答案:

答案 0 :(得分:5)

模板API文档中记录了这一点:https://docs.djangoproject.com/en/stable/ref/templates/api/#variables-and-lookups

  

有时您可能会出于其他原因关闭此功能,并告诉模板系统保留一个未调用的变量,无论如何。为此,请在callable上设置do_not_call_in_templates属性,其值为True。然后,模板系统将表现为您的变量不可调用(例如,允许您访问可调用的属性)。

要执行此操作,请更改您的函数以设置do_not_call_in_templates标志:

def get_admin_credentials(self):
    return decrypt(self.admin_credentials)
get_admin_credentials.do_not_call_in_templates = True