объект ‘CharField’ не имеет атрибута ‘is_hidden’ при передаче начального значения в CharField формы, которая использует виджет TinyMCE

#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. О, я думал, что пробовал это, но, по-видимому, одна из строк была отключена раньше. Спасибо!