在我的Django 1.10项目中,我有一个模型:
class Contact(models.Model):
notes = models.TextField()
...和ModelForm:
class ContactForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ContactForm, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'form-control input-sm plain'
if field.required == True:
field.widget.attrs['required'] = ''
class Meta:
model = Contact
fields = ('notes',)
我有两个问题:
notes
而不是textarea将div
字段呈现为contenteditable=true
吗?第二个问题有点模糊,所以我很感激有关第一个问题的提示。我已阅读了文档,但无法找到相关部分:(
答案 0 :(得分:1)
在这种情况下,<div contenteditable="true">...</div>
您可以自定义用于呈现表单字段的窗口小部件。基本上,当您声明字段时,您必须传递参数widget=TheWidgetClass
。 Django有很多builtin widgets你可以使用。但你也可以定义自己的。要知道如何,您将在Internet上找到许多资源。只需搜索&#34; django创建自定义小部件&#34;在搜索引擎上,或在SO上。可能的答案:Django: How to build a custom form widget?
由于Django没有提供有关如何创建自定义窗口小部件的任何官方文档,因此最明智的方法是创建一个继承Django's TextArea并使用基于original one的自定义html模板的类。
基本上,您必须确保在POST数据中将div标记的值与其他输入值一起发送到表单的目标视图。换句话说,您必须确保div的内容像任何表单字段的内容一样。 也许this SO question可以帮助您:当用户点击提交按钮时,一个解决方案可能是使用JavaScript将div的内容复制到表单中隐藏的textarea标记。
祝你好运;)答案 1 :(得分:0)
首先可以使用jquery完成。由于django将使用id ='id_notes'加载textarea。所以在那之后你可以选择元素并做任何你想做的事。
在第二个中你可以通过在forms.py中编写自己的保存函数来重新定义save方法。这是一个用于url shortener的example。 基本上保存方法,定义在将某些内容提交到数据库时要执行的内容。