Django-ckeditor: editor-element-conflict
Django-ckeditor в цикле for корректно отображается только для первой итерации. На остальных итерациях отображается форма шаблона по умолчанию, как показано ниже. В документации я вижу ошибку конфликта элементов, но там ничего не сказано, как решить. ckeditor.js:21 [CKEDITOR] Код ошибки: editor-element-conflict. Заранее спасибо!
Here is my template code
<div class="d-none" id="comment-{{answer.id}}" >
{% for comment in answer.comment_set.all %}
<div class="card mb-2" >
<div class="card-body">
<p>{{comment.comment|safe}}</p>
<p> <a href="#">{{comment.user.username}}</a> </p>
</div>
</div>
{% endfor %}
</div>
<div class="d-none" id="commentForm-{{answer.id}}">
{% if user.is_authenticated %}
<div class="commentform">
<form method="post">
<div class="form-group">
{% csrf_token %}
{{ commentForm.media }}
{{commentForm|crispy}}
<input type="hidden" name="answerid" value="{{ answer.id }}">
<input type="submit" name="submit" value="Submit" >
</div>
</form>
</div>
{% endif %}
Я разобрался! Это происходит потому, что поля имеют одинаковый ID, и CKEditor путается, потому что находит несколько элементов с одинаковым ID. Решение: менять ID динамически во время генерации страницы.
Я не знаю структуру вашей модели, но могу предположить, что ваша форма определена следующим образом:
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = “__all__”
Тогда вам нужно изменить его следующим образом:
from ckeditor.widgets import CKEditorWidget
class CommentForm(forms.ModelForm):
base_textarea_id = "id_comment"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.textarea_id_counter = 0
self.fields['comment'].widget = CKEditorWidget(attrs={'id': self.get_textarea_next_id})
def get_textarea_next_id(self):
result = self.base_textarea_id + str(self.textarea_id_counter)
self.textarea_id_counter += 1
return result
class Meta:
model = Comment
fields = “__all__”
На вашем месте я бы сделал имя переменной формы с использованием змеиного регистра и изменил бы название поля "comment" внутри модели Comment на что-то другое (даже "text" было бы лучше), но решать, конечно, вам.