frappe.ui.form.ControlHTML = frappe.ui.form.Control.extend({
	make: function() {
		this._super();
		this.disp_area = this.wrapper;
	},
	refresh_input: function() {
		var content = this.get_content();
		if(content) this.$wrapper.html(content);
	},
	get_content: function() {
		return this.df.options || "";
	},
	html: function(html) {
		this.$wrapper.html(html || this.get_content());
	},
	set_value: function(html) {
		if(html.appendTo) {
			// jquery object
			html.appendTo(this.$wrapper.empty());
		} else {
			// html
			this.df.options = html;
			this.html(html);
		}
	}
});

frappe.ui.form.ControlHTML = frappe.ui.form.Control.extend({
	make: function() {
		this._super();
		this.disp_area = this.wrapper;
		this.frm.$wrapper.on('blur change', () => {
			setTimeout(() => this.refresh_input(), 500);
		});
	},
	refresh_input: function() {
		var content = this.get_content();
		if(content) this.$wrapper.html(content);
	},
	get_content: function() {
		var content = this.df.options || "";
		return frappe.render(content, this);
	},
	html: function(html) {
		this.$wrapper.html(html || this.get_content());
	},
	set_value: function(html) {
		if(html.appendTo) {
			// jquery object
			html.appendTo(this.$wrapper.empty());
		} else {
			// html
			this.df.options = html;
			this.html(html);
		}
	}
});

Enable using templates inside ControlHTML
Enable using templates inside ControlHTML

This change would enable showing computed data based on other fields in the same doc, without storing the computed data (which avoid unnecessary redundancy).
