27 from django.utils.html import escape |
27 from django.utils.html import escape |
28 from django.utils import simplejson |
28 from django.utils import simplejson |
29 from django.utils.safestring import mark_safe |
29 from django.utils.safestring import mark_safe |
30 |
30 |
31 class TinyMCE(forms.widgets.Textarea): |
31 class TinyMCE(forms.widgets.Textarea): |
32 """ |
32 """TinyMCE widget. |
33 TinyMCE widget. requires you include tiny_mce_src.js in your template |
33 |
34 you can customize the mce_settings by overwriting instance mce_settings, |
34 Requires to include tiny_mce_src.js in your template. Widget can be |
35 or add extra options using update_settings |
35 customized by overwriting or adding extra options to mce_settings |
|
36 dictionary |
|
37 |
|
38 You can set TinyMCE widget for particular form field using code below: |
|
39 class ExampleForm(forms_helpers.DbModelForm): |
|
40 content = forms.fields.CharField(widget=custom_widgets.TinyMCE()) |
|
41 |
|
42 You can include tiny_mce_src.js in your template using: |
|
43 {% block scripts %} |
|
44 <script type="text/javascript" src="/tiny_mce/tiny_mce_src.js"></script> |
|
45 {% endblock %} |
36 """ |
46 """ |
|
47 MCE_DEF_SETTINGS = { 'mode': "exact", |
|
48 'theme': "simple", |
|
49 'theme_advanced_toolbar_location': "top", |
|
50 'theme_advanced_toolbar_align': "center"} |
37 |
51 |
38 mce_settings = dict( |
52 mce_settings = MCE_DEF_SETTINGS |
39 mode = "exact", |
|
40 theme = "simple", |
|
41 theme_advanced_toolbar_location = "top", |
|
42 theme_advanced_toolbar_align = "center", |
|
43 ) |
|
44 |
53 |
45 def update_settings(self, custom): |
54 TINY_MCE_HTML_FMT = u'''<textarea %(attrs)s>%(value)s</textarea> |
46 return_dict = self.mce_settings.copy() |
55 <script type="text/javascript"> |
47 return_dict.update(custom) |
56 tinyMCE.init(%(settings_json)s)</script>''' |
48 return return_dict |
57 |
49 |
|
50 def render(self, name, value, attrs=None): |
58 def render(self, name, value, attrs=None): |
|
59 """Render TinyMCE widget as HTML. |
|
60 """ |
51 if value is None: |
61 if value is None: |
52 value = '' |
62 value = '' |
53 value = smart_unicode(value) |
63 value = smart_unicode(value) |
54 final_attrs = self.build_attrs(attrs, name=name) |
64 final_attrs = self.build_attrs(attrs, name=name) |
55 |
65 |
56 self.mce_settings['elements'] = "id_%s" % name |
66 self.mce_settings['elements'] = "id_%s" % name |
|
67 |
|
68 # convert mce_settings from dict to JSON |
57 mce_json = simplejson.JSONEncoder().encode(self.mce_settings) |
69 mce_json = simplejson.JSONEncoder().encode(self.mce_settings) |
58 |
70 |
59 return mark_safe(u'<textarea%s>%s</textarea> \ |
71 return mark_safe( self.TINY_MCE_HTML_FMT % |
60 <script type="text/javascript">\ |
72 { 'attrs': flatatt(final_attrs), |
61 tinyMCE.init(%s)</script>' % (flatatt(final_attrs), |
73 'value': escape(value), |
62 escape(value), |
74 'settings_json': mce_json}) |
63 mce_json)) |
|