app/soc/views/helpers/custom_widgets.py
changeset 188 27ed1a09c98d
parent 141 e120c24b89e2
child 194 8bdb1d2d0c36
equal deleted inserted replaced
187:2c0a497b2b2a 188:27ed1a09c98d
    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))