Django-TinyMCE с несколькими формами

Я пытаюсь создать одну HTML-страницу с несколькими экземплярами редакторов TinyMCE. Количество редакторов зависит от запроса; поэтому я не могу перечислить их и инициализировать по отдельности. Вот мой код:

views.py:

from tinymce.widgets import TinyMCE
class ThreadForm(forms.Form):
    subject = forms.CharField(max_length=300, widget=forms.TextInput(attrs={'size':'100'}))
    body = forms.CharField(widget=TinyMCE())
class MessageForm(forms.Form):
    thread_pk = forms.IntegerField()
    body = forms.CharField(widget=TinyMCE())

urls.py:

urlpatterns = patterns('',
    ...
    url(r'^tinymce/', include('tinymce.urls')),
)

settings.py:

INSTALLED_APPS = (
    ...
    'tinymce',
)
...
TINYMCE_DEFAULT_CONFIG = {
    'selector': 'textarea',
    'theme': 'advanced',
    'width': 600,
    'height': 300,
    'theme_advanced_toolbar_location': 'top',
    'theme_advanced_buttons1': 'bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,outdent,indent,hr,|,undo,redo',
    'theme_advanced_buttons2': 'cut,copy,paste,pastetext,pasteword,|,search,replace,|,link,unlink,charmap,|,visualaid,table,|,blockquote,sub,sup,|,preview,code,emotions,image',
    'theme_advanced_buttons3': '',
    'plugins': 'paste,table,spellchecker,searchreplace,emotions',
    'theme_advanced_resizing': True,
}

member_forums.html:

...
{% block headers %}
{{ thread_form.media }}
{% endblock %}
...
<table id="new_thread_table">
    {{ thread_form.as_table }}
</table>
...
{% for message_form in message_forms %}
    <table class="new_message_table">
        {{ message_form.as_table }}
    </table>
    ...
{% endfor %}

В шаблоне есть одна ThreadForm и несколько MessageForm.

Когда я комментирую MessageForms в HTML, ThreadForm, кажется, работает, но когда я раскомментирую их, ThreadForm загружается со скином TinyMCE, который не обновляется (добавление текста не делает кнопку отмены включенной, даже если она ), и когда я отправляю форму, запись в теле формы отсутствует, что приводит к form.is_valid ошибке.

У меня есть только {{ thread_form.media }} в заголовке моего шаблона и ничего для MessageForms. Итерации через:

{% for message_form in message_forms %}
    {{ message_form.media }}
{% endfor %}

тоже не принесла никакой пользы.

После некоторых исследований выяснилось, что TinyMCE инициализируется слишком много раз при загрузке MessageForms, что приводит к потере данных во время отправки формы (ИЗМЕНИТЬ в верхнем ответе на: TinyMCE с Django: это поле обязательно для заполнения)

Я не понимаю, как заставить это работать. Любая помощь или указатели будут оценены.


person Nagra    schedule 01.04.2014    source источник
comment
Комментирование thread_form приводит к тому, что первая message_form появляется со скином TinyMCE без каких-либо функций и с той же ошибкой при попытке отправить данные.   -  person Nagra    schedule 01.04.2014
comment
Вверху добавлен скрипт, который просто вызывает tinyMCE.init ({theme: advanced,}); Не имеет значения, когда другие формы закомментированы. Так может быть проблема не в том, что init вызывается слишком много раз? Кажется, проблема в том, что у вас больше одного поля TinyMCE.   -  person Nagra    schedule 01.04.2014


Ответы (3)


Удален Django-TinyMCE и начал использовать TinyMCE 4.0.21. Теперь он отлично работает.

views.py:

...
class ThreadForm(forms.Form):
    subject = forms.CharField(max_length=300, widget=forms.TextInput(attrs={'size':'100'}))
    body = forms.CharField(widget=forms.Textarea(attrs={'class':'thread'}))
...

member_forums.html:

...
{% block headers %}
<script type="text/javascript" src="{% static 'tinymce/tinymce.min.js' %}"></script>
<script type="text/javascript" src="{% static 'tinymce/threads.js' %}"></script>
{% endblock %}

{% block content %}
    ...
    <form id="new_thread_form" method="post" action="">
        {% csrf_token %}
        <table id="new_thread_table">
            {{ thread_form.as_table }}
        </table>
    </form>
    ...
    <form class="new_message_form" method="post" action="">
    {% csrf_token %}
    {% for message_form in message_forms %}
        {{ message_form.thread_pk }}
        <textarea class="message" name="body"></textarea>
    {% endfor %}
    ...
{% endblock %}

threads.js:

tinyMCE.init({
    selector: "textarea.thread",
    theme: "modern",
    ...
});

tinyMCE.init({
    selector: "textarea.message",
    theme: "modern",
    ...
});
person Nagra    schedule 02.04.2014

TinyMCE использует идентификатор, чтобы указать, какое текстовое поле должно быть TinyMCE, а идентификаторы должны быть уникальными в HTML. Поскольку оба моих тела назывались body, Django form.as_table отображал их с одним и тем же идентификатором. Когда TinyMCE попытался назначить редактор идентификатору, он потерпел неудачу, когда достиг второго поля с тем же идентификатором. Аналогичная проблема:

TinyMCE не работает при загрузке двух текстовых полей

Я изменил MessageForm.body на MessageForm.body1, и это заставило ThreadForm TinyMCE работать как шарм. Теперь мне нужно перебрать и изменить идентификатор каждой формы сообщения. Но должно быть лучшее решение. TinyMCE должен уметь отображать все текстовые поля. Может быть, вообще удалить идентификаторы?

person Nagra    schedule 01.04.2014
comment
Нет, вы можете изменить это, используя selector: textarea в файле конфигурации TinyMCE. - person xyres; 01.04.2014
comment
Я попробую установить 'selector': 'textarea' в моей переменной конфигурации TinyMCE по умолчанию в settings.py и посмотрю, имеет ли это значение, прежде чем пробовать собственное решение. - person Nagra; 02.04.2014
comment
selector: textarea ничего не изменил. Проблема заключалась в том, что идентификаторы были одинаковыми. идентификаторы должны быть уникальными. Исправлено динамическое присвоение id. - person Nagra; 02.04.2014

Приведенное ниже решение работает для меня. По-видимому, что-то не так с кодом javascript по умолчанию TinyCME.

С текущими настройками ваших django и tinycme-django вам просто нужно добавить функцию js для перезаписи скрипта tinycme по умолчанию.

Перейдите к файлу .js, который загружается на вашу HTML-страницу, и добавьте функцию ниже:

(function ($) {
    function tinymce4_init(selector) {
        var tinymce4_config = { setup: function (editor) { editor.on('change', function () { editor.save(); }); }, "language": "en", "directionality": "ltr", "cleanup_on_startup": true, "custom_undo_redo_levels": 20, "selector": "textarea.tinymce4-editor", "theme": "modern", "plugins": "\n            textcolor save link image media preview codesample contextmenu\n            table code lists fullscreen  insertdatetime  nonbreaking\n            contextmenu directionality searchreplace wordcount visualblocks\n            visualchars code fullscreen autolink lists  charmap print  hr\n            anchor pagebreak\n            ", "toolbar1": "\n            fullscreen preview bold italic underline | fontselect,\n            fontsizeselect  | forecolor backcolor | alignleft alignright |\n            aligncenter alignjustify | indent outdent | bullist numlist table |\n            | link image media | codesample |\n            ", "toolbar2": "\n            visualblocks visualchars |\n            charmap hr pagebreak nonbreaking anchor |  code |\n            ", "contextmenu": "formats | link image", "menubar": true, "statusbar": true }; if (typeof selector != 'undefined') { tinymce4_config['selector'] = selector; }
        tinymce.init(tinymce4_config);
    }
    tinymce4_init();
})();

В приведенном выше сценарии измените selector: textarea.tinymce4-editor, чтобы он соответствовал вашему собственному классу / идентификатору / тегу. Это полный фрагмент со всеми плагинами и т. Д.

для упрощенной версии вы можете использовать:

 tinyMCE.init({
     selector: "#id_blog-content",
     theme: "modern"
 });

Где селектор относится к идентификатору / классу / тегу вашей формы.

@Nagra: Чтобы использовать уникальные идентификаторы для разных форм на одной html-странице, вы можете используйте префикс для формы. таким образом каждое поле вашей формы получает уникальный идентификатор в следующем формате:
id_{prefix}-{field name}.

У меня есть уникальные идентификаторы для каждой формы и селектора: textarea. Но это не решает проблемы.

person Adrian Akbari    schedule 08.01.2021