from django.forms import widgets from django.utils.safestring import mark_safe from django.conf import settings import os class LocationWidget(widgets.TextInput): def __init__(self, attrs=None, based_field=None, zoom=None, width=610, height=480, **kwargs): self.based_field = based_field self.zoom = zoom self.width = width self.height = height super(LocationWidget, self).__init__(attrs) def render(self, name, value, attrs=None, renderer=None): if value is not None and len(value) > 0: lat, lng, zoom = value.split(',') value = '%s,%s,%d' % ( float(lat), float(lng), float(zoom) ) else: value = '' based_field = "#id_" + self.based_field.name attrs = attrs or {} attrs['readonly'] = "readonly" attrs['data-location-widget'] = name attrs['data-based-field'] = based_field attrs['data-zoom'] = self.zoom attrs['data-map'] = '#map_' + name attrs['data-dialog-id'] = "#map_dialog_" + name text_input = super(LocationWidget, self).render(name, value, attrs) path = os.path.abspath(os.path.dirname(__file__)) with open(path + "/media/form.html", 'r') as content_file: html = content_file.read() return mark_safe(text_input + html % {'name': name, 'width': self.width, 'height': self.height}) class Media: css = { 'all': ('/location_field/media/form.css',) } # Use schemaless URL so it works with both, http and https websites js = ( '//maps.google.com/maps/api/js?sensor=false&language=de&key={}'.format(settings.GOOGLE_MAPS_API_KEY), '/static/js/bindWithDelay.js', '/location_field/media/form.js', )