![]() |
tinymce 1.5.1 documentation |
Search
|
django-tinymce is a Django application that contains a widget to render a form field as a TinyMCE editor.
The django-tinymce code is licensed under the MIT License. See the LICENSE.txt
file in the distribution. Note that the TinyMCE editor is distributed under
its own license.
Starting with django-tinymce v1.5.1 TinyMCE editor is bundled with django-tinymce to enable easy installation and usage. django-staticfiles support is added to provide an easier way to configure and use django-tinymce. Note that django-tinymce and TinyMCE licenses are compatible (although different) and we have permission to bundle TinyMCE with django-tinymce.
This section describes how to install the django-tinymce application in your Django project.
The django-tinymce application requires Django version 1.0 or higher. You will also
need TinyMCE version 3.0.1 or higher and a language pack for every
language you enabled in settings.LANGUAGES
. If you use the django-filebrowser
application in your project, the tinymce application can use it as a browser
when including media.
If you want to use the spellchecker plugin using the supplied view (no PHP
needed) you must install the PyEnchant package and dictionaries for your
project languages. Note that the Enchant needs a dictionary that exactly
matches your language codes. For example, a dictionary for code 'en-us'
will not automatically be used for 'en'
. You can check the availability of
the Enchant dictionary for the 'en'
language code using the following
Python code:
import enchant
enchant.dict_exists('en')
Note that the documentation will use ‘TinyMCE’ (capitalized) to refer the editor itself and ‘django-tinymce’ (lower case) to refer to the Django application.
Install django-tinymce using pip (or any other way to install python package) from PyPI. If you need to use a different way to install django-tinymce you can place the tinymce
module on your Python path. You can put it into your Django project directory or run python setup.py install
from a shell.
pip install django-tinymce
Add tinymce
to INSTALLED_APPS in settings.py
for your project:
INSTALLED_APPS = (
...
'tinymce',
...
)
Add tinymce.urls
to urls.py
for your project:
urlpatterns = patterns('',
...
(r'^tinymce/', include('tinymce.urls')),
...
)
If you are using django-staticfiles
you can skip this step. Copy the jscripts/tiny_mce
directory from the TinyMCE distribution (see Prerequisites) into a directory named js
in your media root. You can override the location in your settings (see below).
Verify that everything is installed and configured properly:
Setup an isolated environment with virtualenv and activate environment:
virtualenv --no-site-packages env
. env/bin/activate
Install required packages:
pip install Django django-staticfiles django-tinymce
Setup environment variable DJANGO_SETTINGS_MODULE
:
export DJANGO_SETTINGS_MODULE='testtinymce.staticfiles_settings'
Setup test database (it will be created in current folder):
django-admin.py syncdb
Run Django runserver command to verify results:
django-admin.py runserver
Open this address in a browser:
http://localhost:8000/admin/testapp/testpage/add/
If you see TinyMCE instead of standard textarea boxes everything is working fine, otherwise check installation steps.
The application can be configured by editing the project’s settings.py
file.
TINYMCE_JS_URL
(default: settings.MEDIA_URL + 'js/tiny_mce/tiny_mce.js'
)The URL of the TinyMCE javascript file:
TINYMCE_JS_URL = os.path.join(MEDIA_ROOT, "path/to/tiny_mce/tiny_mce.js")
TINYMCE_JS_ROOT
(default: settings.MEDIA_ROOT + 'js/tiny_mce'
)The filesystem location of the TinyMCE files. It is used by the compressor (see below):
TINYMCE_JS_ROOT = os.path.join(MEDIA_ROOT, "path/to/tiny_mce")
TINYMCE_DEFAULT_CONFIG
(default: {'theme': "simple", 'relative_urls': False}
)mce_attrs
parameter for the widget.TINYMCE_SPELLCHECKER
(default: False
)spellchecker
to the TinyMCE plugin list yourself, it is not added
automatically.TINYMCE_COMPRESSOR
(default: False
)TINYMCE_FILEBROWSER
(default: True
if 'filebrowser'
is in INSTALLED_APPS
, else False
)Example:
TINYMCE_JS_URL = 'http://debug.example.org/tiny_mce/tiny_mce_src.js'
TINYMCE_DEFAULT_CONFIG = {
'plugins': "table,spellchecker,paste,searchreplace",
'theme': "advanced",
'cleanup_on_startup': True,
'custom_undo_redo_levels': 10,
}
TINYMCE_SPELLCHECKER = True
TINYMCE_COMPRESSOR = True
The application can enable TinyMCE for one form field using the widget
keyword argument of Field
constructors or for all textareas on a page using
a view.
If you use the widget (recommended) you need to add some python code and possibly modify your template.
The TinyMCE widget can be enabled by setting it as the widget for a formfield. For example, to use a nice big TinyMCE widget for the content field of a flatpage form you could use the following code:
from django import forms
from django.contrib.flatpages.models import FlatPage
from tinymce.widgets import TinyMCE
class FlatPageForm(forms.ModelForm):
...
content = forms.CharField(widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
...
class Meta:
model = FlatPage
The widget accepts the following extra keyword argument:
mce_attrs
(default: {}
)settings.TINYMCE_DEFAULT_CONFIG
(see Configuration) are applied
first and can be overridden.
Python types are automatically converted to Javascript types, using standard
JSON encoding. For example, to disable word wrapping you would include
'nowrap': True
.The tinymce application adds one TinyMCE configuration option that can be set
using mce_attrs
(it is not useful as a default configuration):
content_language
(default: django.utils.translation.get_language_code()
)language
,
directionality
and spellchecker_languages
configuration options of
the TinyMCE editor. It may be different from the interface language, which
defaults to the current Django language and can be changed using the
language
configuration option in mce_attrs
)The widget requires a link to the TinyMCE javascript code. The
django.contrib.admin
templates do this for you automatically, so if you are
just using tinymce in admin forms then you are done. In your own templates
containing a TinyMCE widget you must add the following to the HTML HEAD
section (assuming you named your form ‘form’):
<head>
...
{{ form.media }}
</head>
See also the section of form media in the Django documentation.
HTMLField
model field type¶For lazy developers the tinymce application also contains a model field type
for storing HTML. It uses the TinyMCE widget to render its form field. In this
example, the admin will render the my_field
field using the TinyMCE
widget:
from django.db import models
from tinymce import models as tinymce_models
class MyModel(models.Model):
my_field = tinymce_models.HTMLField()
In all other regards, HTMLField
behaves just like the standard Django
TextField
field type.
If you cannot or will not change the widget on a form you can also use the
tinymce-js
named view to convert some or all textfields on a page to
TinyMCE editors. On the template of the page, add the following lines to the
HEAD
element:
{% load url from future %}
<script type="text/javascript" src="{{ MEDIA_URL }}js/tiny_mce/tiny_mce.js"></script>
<script type="text/javascript" src="{% url "tinymce-js" "NAME" %}"></script>
The NAME
argument allows you to create multiple TinyMCE configurations. Now
create a template containing the Javascript initialization code. It should be
placed in the template path as NAME/tinymce_textareas.js
or
tinymce/NAME_textareas.js
.
Example:
tinyMCE.init({
mode: "textareas",
theme: "advanced",
plugins: "spellchecker,directionality,paste,searchreplace",
language: "{{ language }}",
directionality: "{{ directionality }}",
spellchecker_languages : "{{ spellchecker_languages }}",
spellchecker_rpc_url : "{{ spellchecker_rpc_url }}"
});
This example also shows the variables you can use in the template. The language
variables are based on the current Django language. If the content language is
different from the interface language use the tinymce-js-lang
view which
takes a language (LANG_CODE
) argument:
{% load url from future %}
<script type="text/javascript" src="{% url "tinymce-js-lang" "NAME","LANG_CODE" %}"></script>
The TinyMCE link and image dialogs can be enhanced with a predefined list of links and images. These entries are filled using a variable loaded from an external Javascript location. The tinymce application can serve these lists for you.
To use a predefined link list, add the external_link_list_url
option to the
mce_attrs
keyword argument to the widget (or the template if you use the
view). The value is a URL that points to a view that fills a list of 2-tuples
(name, URL) and calls tinymce.views.render_to_link_list
. For example:
Create the widget:
from django import forms
from django.core.urlresolvers import reverse
from tinymce.widgets import TinyMCE
class SomeForm(forms.Form):
somefield = forms.CharField(widget=TinyMCE(mce_attrs={'external_link_list_url': reverse('someapp.views.someview')})
Create the view:
from tinymce.views import render_to_link_list
def someview(request):
objects = ...
link_list = [(unicode(obj), obj.get_absolute_url()) for obj in objects]
return render_to_link_list(link_list)
Finally, include the view in your URLconf.
Image lists work exactly the same way, just use the TinyMCE
external_image_list_url
configuration option and call
tinymce.views.render_to_image_list
from your view.
flatpages_link_list
view¶As an example, the tinymce application contains a predefined view that lists
all django.contrib.flatpages
objects:
tinymce.views.flatpages_link_list
. If you want to use a TinyMCE widget for
the flatpages content
field with a predefined list of other flatpages in
the link dialog you could use something like this:
from django import forms
from django.core.urlresolvers import reverse
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.models import FlatPage
from tinymce.widgets import TinyMCE
class TinyMCEFlatPageAdmin(FlatPageAdmin):
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name == 'content':
return db_field.formfield(widget=TinyMCE(
attrs={'cols': 80, 'rows': 30},
mce_attrs={'external_link_list_url': reverse('tinymce.views.flatpages_link_list')},
))
return super(TinyMCEFlatPageAdmin, self).formfield_for_dbfield(db_field, **kwargs)
somesite.register(FlatPage, TinyMCEFlatPageAdmin)
If you want to enable this for the default admin site
(django.contrib.admin.site
) you will need to unregister the original
ModelAdmin class for flatpages first:
from django.contrib import admin
admin.site.unregister(FlatPage)
admin.site.register(FlatPage, TinyMCEFlatPageAdmin)
The source contains a test project that includes this flatpages model admin. You just need to add the TinyMCE javascript code.
svn checkout http://django-tinymce.googlecode.com/svn/trunk/testtinymce
tiny_mce
directory from the TinyMCE distribution into
media/js
python manage.py syncdb
python manage.py runserver
TinyMCE contains a preview plugin that can be used to allow the user to view
the contents of the editor in the website context. The tinymce application
provides a view and a template tag to make supporting this plugin easier. To
use it point the plugin_preview_pageurl
configuration to the view named
tinymce-preview
:
from django.core.urlresolvers import reverse
widget = TinyMCE(mce_attrs={'plugin_preview_pageurl': reverse('tinymce-preview', "NAME")})
The view named by tinymce-preview
looks for a template named either
tinymce/NAME_preview.html
or NAME/tinymce_preview.html
. The template
accesses the content of the TinyMCE editor by using the tinymce_preview
tag:
{% load tinymce_tags %}
<html>
<head>
...
{% tinymce_preview "preview-content" %}
</head>
<body>
...
<div id="preview-content"></div>
...
With this template code the tekst inside the HTML element with id
preview-content
will be replace by the content of the TinyMCE editor.
db_field.formfield
instead of
forms.CharField
.tinymce was written by Joost Cassee based on the work by John D’Agostino. It was partly taken from his code at the Django code wiki. The TinyMCE Javascript WYSIWYG editor is made by Moxiecode.
The TinyMCE compressor was written by Jason Davies based on the PHP TinyMCE compressor from Moxiecode.