2011-08-20 30 views
5

Khi tôi nhấp vào Add another {{ verbose_name }} trong khối nội tuyến, hiển thị tinymce-textatea, nhưng tất cả các điều khiển và chỉnh sửa đều bị tắt (không có lỗi trong bảng điều khiển). Trong 3 tin nhắn textarea đầu tiên của công trình đúng cách. Imho nó là vấn đề init.
Code:django StackedInline tinyMCE problem

#templates\admin\base.html 
<script type="text/javascript" src="{% admin_media_prefix %}tinymce/jscripts/tiny_mce/tiny_mce.js"></script> 
<script type="text/javascript"> 
    window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}"; 

    var tMCE = tinyMCE.init({ 
     //General otptions 
     mode : 'textareas', 
     theme: 'advanced', 
     readonly : false, 
     plugins : 'autolink,lists,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template', 

     // Theme options 
     theme_advanced_buttons1 : 'save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontsizeselect,|,forecolor,backcolor', 
     theme_advanced_buttons2 : 'cut,copy,paste,pastetext,pasteword,|,search,replace,|,undo,redo,|,link,unlink,anchor,|,image,media,|,fullscreen,code', 
     theme_advanced_buttons3 : '', 
     theme_advanced_toolbar_location : 'top', 
     theme_advanced_toolbar_align : 'left', 
     theme_advanced_statusbar_location : 'bottom', 
     theme_advanced_resizing : true, 

     file_browser_callback : function(field_name, url, type, win) { 
      var w = window.open('/elfinder', null, 'width=1000,height=800'); 
      w.tinymceFileField = field_name; 
      w.tinymceFileWin = win; 
     } 

    }); 
</script> 

#admin.py 
class PostInline(admin.TabularInline): 
    model = Post 
    readonly_fields = ('created', 'updated') 

class ItemAdmin(admin.ModelAdmin): 
    inlines = [ 
     PostInline, 
    ] 
    readonly_fields = ('created', 'updated') 

UPDATE:

#base.html 

$(document).ready(function(){  
    tinyMCE.settings = tinyMCE_opt; 
    $('textarea:not(.inline-group textarea)').each(function() { 
     tinyMCE.execCommand('mceAddControl', false, this.id); 
    }); 
}); 
#stacked.html 
$(rows).formset({ 
      prefix: "{{ inline_admin_formset.formset.prefix }}", 
      addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}", 
      formCssClass: "dynamic-{{ inline_admin_formset.formset.prefix }}", 
      deleteCssClass: "inline-deletelink", 
      deleteText: "{% trans "Remove" %}", 
      emptyCssClass: "empty-form", 
      removed: updateInlineLabel, 
      added: (function(row) { 
       initPrepopulatedFields(row); 
       reinitDateTimeShortCuts(); 
       updateSelectFilter(); 
       updateInlineLabel(row); 

       $(row).find('textarea').each(function() { 
        tinyMCE.execCommand('mceAddControl', false, this.id); 
       }); 

      }) 
     }); 

Nhưng xuất hiện một vấn đề khác:
Nếu một lỗi phương pháp formset không hoạt động nữa và inlines textareas xảy ra là một textareas đơn giản

+0

Âm thanh như cho tinymce 4 lệnh trở thành 'tinymce.execCommand ('mceAddEditor', false, this.id);', nhưng tôi tìm thấy tài liệu của họ về điều này khó tìm. –

Trả lời

3

giải pháp (nhờ Thomas):

#base.html 
$(document).ready(function(){  
    tinyMCE.settings = tinyMCE_opt; 
    $('textarea:not(.inline-group textarea)').each(function() { 
     tinyMCE.execCommand('mceAddControl', false, this.id); 
    });   
}); 

#stacked.html 

$(rows).formset({ 
    prefix: "{{ inline_admin_formset.formset.prefix }}", 
    addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}", 
    formCssClass: "dynamic-{{ inline_admin_formset.formset.prefix }}", 
    deleteCssClass: "inline-deletelink", 
    deleteText: "{% trans " 
    Remove " %}", 
    emptyCssClass: "empty-form", 
    removed: updateInlineLabel, 
    added: (function (row) { 
     initPrepopulatedFields(row); 
     reinitDateTimeShortCuts(); 
     updateSelectFilter(); 
     updateInlineLabel(row); 
     $(row).find('textarea').each(function() { 
      tinyMCE.execCommand('mceAddControl', false, this.id); 
     }); 


    }) 
}); 

$('.dynamic-{{ inline_admin_formset.formset.prefix }} textarea').each(function() { 
    tinyMCE.execCommand('mceAddControl', false, this.id); 
}); 
+0

vấn đề: sau khi nhấp vào biểu tượng đóng và nhấp vào Thêm {{verbose_name}} tinyMCE khác không thành công. solution: 'removed: function (hàng) { updateInlineLabel (hàng); $ (hàng) .find ('textarea') .each (function() { tinyMCE.execCommand ('mceRemoveControl', false, this.id); }); }, ' – cetver

2

Thật không may, bạn cần phải nắm bắt rằng nút "mới nội tuyến" báo chí và sử dụng nó để đính kèm mce để mới cr tự ăn các cánh đồng. hoặc bạn có thể bắt đầu lại toàn bộ trang nhưng điều đó sẽ lãng phí.

EDIT:

bạn cần phải sử dụng

django.jquery("#id-of-button").click(function() { 
    tinyMCE.execCommand('mceAddControl',false,'id-of-new-textarea'); 
} 
+0

>> o đính kèm mce vào các trường mới được tạo. Làm như thế nào ? – cetver

+0

vui lòng xem câu hỏi cập nhật – cetver

0

Dưới đây là một hack mà làm việc (ít nhất là trên TinyMCE 3.x) mà không cần để sửa đổi mẫu.

django.jQuery(function ($) { // django's copy of jQuery is crucial for old_add.click() 
    setTimeout(function() { 
     $('.add-row a').each(function() { 
      var inline_group = $(this).parents('.inline-group'); 
      var new_add = $(this).clone(); 
      var old_add = $(this); 
      old_add.hide().before(new_add); 
      new_add.click(function() { 
       old_add.click(); 
       if (inline_group.find('.mceEditor').length) { 
        var widget = inline_group.find('.form-row:not(.empty-form) .mceEditor'); 
        var textarea = widget.prev('textarea').show(); 
        widget.remove(); 
        tinyMCE.execCommand('mceAddControl', true, textarea.attr('id')); 
       } 
      }); 
     }); 
    }, 0); 
});