让Django为TextField构建contenteditable div而不是textarea

时间:2017-06-08 15:43:06

标签: django django-templates

在我的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',)

我有两个问题:

  1. 我可以让Django使用notes而不是textarea将div字段呈现为contenteditable=true吗?
  2. 如果是,我该如何自动化form.save()方法?
  3. 第二个问题有点模糊,所以我很感激有关第一个问题的提示。我已阅读了文档,但无法找到相关部分:(

2 个答案:

答案 0 :(得分:1)

问题1:呈现具有特定HTML标记的字段

在这种情况下,<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模板的类。

问题2:使用这样的自定义小部件

自动化form.save()方法

基本上,您必须确保在POST数据中将div标记的值与其他输入值一起发送到表单的目标视图。换句话说,您必须确保div的内容像任何表单字段的内容一样。 也许this SO question可以帮助您:当用户点击提交按钮时,一个解决方案可能是使用JavaScript将div的内容复制到表单中隐藏的textarea标记。

祝你好运;)

答案 1 :(得分:0)

首先可以使用jquery完成。由于django将使用id ='id_notes'加载textarea。所以在那之后你可以选择元素并做任何你想做的事。

在第二个中你可以通过在forms.py中编写自己的保存函数来重新定义save方法。这是一个用于url shortener的example。 基本上保存方法,定义在将某些内容提交到数据库时要执行的内容。