rendered paste bodyclass HexColourPicker(TextInput): def __init__(self, attrs=None, template='forms/widgets/hex_colourpicker.html'): super(TextInput, self).__init__(attrs) self.template = template def render(self, name, value, attrs=None, choices=()): if value is None: value = '' elif len(value) > 0 and value[0] == '#': value = value[1:] final_attrs = self.build_attrs(attrs, name=name) flat_att = forms.util.flatatt(final_attrs) output = render_to_string(self.template, { 'name': name, 'value': value, 'rgb_value': HexColourField.hex_to_rgb(value) \ if value else HexColourField.hex_to_rgb('#FFFFFF'), 'final_attrs': final_attrs, 'flat_att': flat_att, }) return mark_safe(output)class HexColourField(fields.Field): widget = HexColourPicker default_error_messages = { 'hex_error': _('This is an invalid color code. '+\ 'It must be given in a valid hexadecimal format: e.g. #000000') } @staticmethod def hex_to_rgb(value): if value[0] == '#': value = value[1:] return (int('0x%s' % value[0:2], 0), int('0x%s' % value[2:4], 0), int('0x%s' % value[4:6], 0)) def clean(self, value): super(HexColourField, self).clean(value) if value in fields.EMPTY_VALUES: return u'' value = smart_unicode(value) value_length = len(value) if value_length != 7 or not re.match( '^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$', value): raise ValidationError(self.error_messages['hex_error']) return value.lower( )[1:] def widget_attrs(self, widget): if isinstance(widget, (fields.TextInput)) or \ isinstance(widget, (HexColourPicker)): return {'maxlength': str(7), 'size': str(7)} <input {{ flat_att|safe }} type='text' value='{% if value %}#{{ value }}{% endif %}' />{% if not skip_display_span %}<span id='display_{{ name }}' class='inline-colour' {% if value %}style='background-color: #{{ value }};'{% else %}style='display: none;'{% endif %} />{% endif %} <script type='text/javascript'> window.addEvent("domready", function(ev) { var el = document.body.getElement("input[name={{ name }}]"); el.store( 'colourpicker', new MooRainbow(el, { 'id': 'picker{{ name }}', 'imgPath': STATIC_URL+'images/mooRainbow/', 'startColor': [{{ rgb_value.0 }}, {{ rgb_value.1 }}, {{ rgb_value.2 }}], 'onComplete': function(val) { el.set('value', val.hex); var next = el.getNext("#display_{{ name }}"); console.log(next); if(next) { next.setStyle("background-color", val.hex); next.setStyle("display", ""); } } }) ); el.addEvent('keyup', function(ev) { if (el.get('value').length == 7) { el.retrieve('colourpicker').hexInput.set('value', el.get('value')); el.retrieve('colourpicker').hexInput.fireEvent('keyup', [el, ev]); } }); el.addEvent('change', function(ev) { if (el.get('value').length == 7) { el.retrieve('colourpicker').hexInput.set('value', el.get('value')); el.retrieve('colourpicker').hexInput.fireEvent('keyup', [el, ev]); } }); }); </script>