I guess that your custom form and custom widget give you trouble. First two things. Just to be sure... Did you add tinymce in settings.py?
INSTALLED_APPS = (
...
'tinymce',
)
And in urlpatterns?
urlpatterns = patterns('',
...
(r'^tinymce/', include('tinymce.urls')),
)
According to the documentation all you need is the tinymce_models.HTMLField(). Like you did. All the rest of your code (custom form and custom widget) is not necessary to load TinyMCE. So in admin.py comment out:
#form = ArticleModelAdminForm
Now fingers crossed and test! Works right? You can switch it back on.
ArticleModelAdminForm needs only the fields that you want to adjust. Remove the headline, pub_date and url fields.
Don't add the js in a widget. But create a new js file. Delete the render function. Add the js location:
class Media:
js = ('/static/tiny_mce/tiny_mce.js',
'/static/tiny_mce/my_advanced_editor.js')
Move class Media to the ModelAdmin. Where it's loaded once, and not for each textarea.
Hope it helps!
EDIT:
TinyMCE looses data on submitting the form because it is initialized to many times. Django doesn't receive the POST data and correctly displays "This field is required". So make sure to initialize TinyMCE once:
models.py
class Article(models.Model):
content = models.TextField() # Normal textfields (Don't load Tiny)
about = models.TextField()
admin.py
class ArticleAdmin(admin.ModelAdmin):
class Media:
js = ('/static/tiny_mce/tiny_mce.js',
'/path/to/my_advanced_editor.js') # Add js to head of admin.
my_advanced_editor.js
tinyMCE.init({
mode: "textareas", // This applies Tiny to all textareas.
theme: "advanced",
...
});
Bonus: Django-TinyMCE makes it 'easy' to apply TinyMCE to fields but selecting fields with TinyMCE is also quite easy. With mode exact:
mode : "exact",
elements : "id_content,id_about",
Or deselect:
mode: "textareas", // All textareas except...
editor_deselector : "NoEditor" // deselects class="NoEditor"
In the last case your FormField needs a widget:
widget=forms.TextInput(attrs={'class':'NoEditor'})