#django #python-3.x #tinymce #django-tinymce
#django #python-3.x #tinymce #django-tinymce
Вопрос:
Я настраиваю сайт, на котором пользователи могут создавать «лекции» со стилизованным текстом лекции. Стилю способствует плагин TinyMCE, применяемый при заполнении lecture_text
поля при создании лекции. Создание лекции работает нормально, но я бы хотел, чтобы этот стилизованный текст уже был в текстовой области лекции формы обновления лекции. Насколько я понимаю, я могу установить содержимое TinyMCE по умолчанию CharField
с initial
аргументом. Вот мой код прямо сейчас:
HTML-код editLecture передает идентификатор лекции в представление editLecture
...
<form method="post" action="{% url 'openvlab:editLecture' lecture_id %}">
{% csrf_token %}
{{ lecture_form.as_p }}
<script src="https://cloud.tinymce.com/5/tinymce.min.js?apiKey=re1omq7fkhbmtyijhb3xvx4cfhyl3op33zggwlqkmbt5swvp"></script>
<script>tinymce.init({ selector:'textarea' });</script>
<button type="submit">Save changes</button>
</form>
представление editLecture передает идентификатор лекции в форму обновления лекции
def editLecture(request,id_string):
...
lecture_form = LectureUpdateForm(lecture_id=id_string)
...
форма обновления лекции
class LectureUpdateForm(forms.ModelForm):
def __init__(self,*args,**kwargs):
lecture_id=kwargs.pop("lecture_id")
lecture = Lecture.objects.get(id__exact=lecture_id)
super(LectureUpdateForm, self).__init__(*args,**kwargs)
self.fields['lecture_text'].widget = forms.CharField(
widget=TinyMCEWidget(
attrs={'required': False, 'cols': 30, 'rows': 10},
),
initial=lecture.lecture_text # this is where I try to define the initial content of the editor
)
class Meta:
model = Lecture
fields = ['lecture_title', 'lecture_description', 'lecture_text']
Однако при попытке получить доступ к странице редактирования лекции я получаю ошибку AttributeError: объект ‘CharField’ не имеет атрибута ‘is_hidden’. (Если вам нужна более подробная обратная трассировка, дайте мне знать, и я ее предоставлю.)
Я довольно новичок в Django, поэтому прошу прощения, если я пропустил что-то очевидное или мой код не соответствует соглашениям; насколько мне известно, эта ошибка не рассматривается ни в одном из других вопросов, которые я видел на этом сайте.
Ответ №1:
Вы устанавливаете виджет на объект Field, который сам по себе имеет виджет. Не делай этого.
self.fields['lecture_text'] = forms.CharField(...)
# ^
Однако, это не способ сделать что-либо из этого. Вы должны передавать instance
атрибут при инициализации формы из представления, тогда вам вообще не нужно возиться с исходными данными.
lecture = Lecture.objects.get(id=id_string)
lecture_form = LectureUpdateForm(instance=lecture)
Комментарии:
1. О, я думал, что пробовал это, но, по-видимому, одна из строк была отключена раньше. Спасибо!