'CharField' 将初始值传递给使用 TinyMCE 小部件的表单的 CharField 时,对象没有属性 'is_hidden'
'CharField' object has no attribute 'is_hidden' when passing initial value to a form's CharField which uses a TinyMCE widget
我正在建立一个网站,用户可以在其中创建 "lectures" 具有程式化讲座文本的网站。在创建讲座时填写 lecture_text
字段时应用的 TinyMCE 插件促进了这种风格。创建讲座效果很好,但我希望这个程式化的文本已经在讲座更新表单的讲座文本区域中。据我了解,我可以使用 initial
参数设置 TinyMCE CharField
的默认内容。这是我现在的代码:
editLecture HTML 将讲座 ID 传递给 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 视图将讲座 ID 传递给讲座更新表单
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 的新手,所以如果我遗漏了一些明显的东西或者我的代码没有遵循约定,我深表歉意;据我所知,我在本网站上看到的任何其他问题都没有解决这个错误。
您正在将小部件设置为 Field 对象,该对象本身有一个小部件。不要那样做。
self.fields['lecture_text'] = forms.CharField(...)
# ^
但是,这不是执行任何操作的方法。从视图初始化表单时,您应该传递 instance
属性,这样您就根本不需要弄乱初始数据。
lecture = Lecture.objects.get(id=id_string)
lecture_form = LectureUpdateForm(instance=lecture)
我正在建立一个网站,用户可以在其中创建 "lectures" 具有程式化讲座文本的网站。在创建讲座时填写 lecture_text
字段时应用的 TinyMCE 插件促进了这种风格。创建讲座效果很好,但我希望这个程式化的文本已经在讲座更新表单的讲座文本区域中。据我了解,我可以使用 initial
参数设置 TinyMCE CharField
的默认内容。这是我现在的代码:
editLecture HTML 将讲座 ID 传递给 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 视图将讲座 ID 传递给讲座更新表单
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 的新手,所以如果我遗漏了一些明显的东西或者我的代码没有遵循约定,我深表歉意;据我所知,我在本网站上看到的任何其他问题都没有解决这个错误。
您正在将小部件设置为 Field 对象,该对象本身有一个小部件。不要那样做。
self.fields['lecture_text'] = forms.CharField(...)
# ^
但是,这不是执行任何操作的方法。从视图初始化表单时,您应该传递 instance
属性,这样您就根本不需要弄乱初始数据。
lecture = Lecture.objects.get(id=id_string)
lecture_form = LectureUpdateForm(instance=lecture)