Без JS это не представляется возможным, к сожалению.
Если кому-то интересно, я исправил решение с VueJS для аналогичной проблемы. В моем случае у меня есть:
<h2 @focusout="updateMainMessage" v-html="mainMessage" contenteditable="true"></h2>
<textarea class="d-none" name="gift[main_message]" :value="mainMessage"></textarea>
В «data» вы можете установить значение по умолчанию для mainMessage, а в методах, которые у меня есть:
methods: {
updateMainMessage: function(e) {
this.mainMessage = e.target.innerText;
}
}
"d-none" - это класс Boostrap 4 для отображения none.
Все просто, и тогда вы можете получить значение поля contenteditable внутри "gift [main_message]" во время обычной отправки формы, например. Я не заинтересован в форматировании, поэтому «innerText» работает лучше, чем «innerHTML» для меня.