2017-06-08 19 views
1

在我的Django 1.10的項目,我有一個模型:讓Django的建立CONTENTEDITABLE格的文本字段,而不是文本區域

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場爲divcontenteditable=true而不是textarea?
  2. 如果是,我該如何自動化form.save()方法?

第二個問題是有點含糊,所以我會很感激關於第一個問題的提示。我已經通過文檔,但找不到相關部分:(

回答

1

問題1:使用特定HTML標記渲染字段

在這種情況下,<div contenteditable="true">...</div>

您可以自定義用於渲染表單域的小部件。基本上,當你聲明該字段時,必須通過參數widget=TheWidgetClass。 Django有很多builtin widgets你可以使用。但是你也可以定義你自己的。要知道如何,你會在互聯網上找到很多資源。只需在搜索引擎或SO上搜索「django創建自定義小部件」即可。可能的答案:Django: How to build a custom form widget?

由於Django不提供有關如何創建自定義窗口小部件的任何正式文件,最聰明的辦法是創建一個類繼承Django's TextArea和使用基於original one的自定義HTML模板。

問題2:自動化form.save()方法,這樣的自定義部件

基本上,你必須確保div標籤的值與其他輸入值發送到表單的目標來看,在POST數據。換句話說,你必須確保div的內容像任何表單域的內容一樣。 也許this SO question可以幫助你:當用戶點擊提交按鈕時,一種解決方案可能是使用JavaScript將div的內容複製到表單中隱藏的textarea標記中。

祝你好運;)

0

第一個可以通過使用jquery完成,因爲django將加載id ='id_notes'的textarea。因此,你可以選擇元素不管你想做的事。

而在第二個,你可以重新定義寫你自己保存功能forms.py這裏保存方法是一個縮短網址的example。 保存方法基本上,定義要什麼當某事正在提交到數據庫時執行

相關問題