Skip to content

Commit a80c8bb

Browse files
committed
Rewrite widget context override
1 parent 4dc6ac0 commit a80c8bb

File tree

1 file changed

+19
-14
lines changed

1 file changed

+19
-14
lines changed

leaflet/forms/widgets.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ class LeafletWidget(BaseGeometryWidget):
1818
modifiable = True
1919
supports_3d = False
2020
include_media = False
21+
geometry_field_class = 'L.GeometryField'
22+
field_store_class = 'L.FieldStore'
23+
target_map = None
2124

2225
@property
2326
def media(self):
@@ -34,22 +37,24 @@ def serialize(self, value):
3437
return value.geojson if value else ''
3538

3639
def render(self, name, value, attrs=None):
37-
assert self.map_srid == 4326, 'Leaflet vectors should be decimal degrees.'
40+
context = self.build_attrs(attrs)
3841

39-
# Retrieve params from Field init (if any)
40-
self.geom_type = self.attrs.get('geom_type', self.geom_type)
42+
id_map = context.get('id', name).replace('-', '_')
43+
context.setdefault('id_map', id_map + '_map') # JS-safe
44+
context.setdefault('id_map_callback', id_map + '_map_callback')
4145

42-
attrs = attrs or {}
46+
override_at_class = ['geom_type', 'modifiable', 'map_srid', 'target_map',
47+
'geometry_field_class', 'field_store_class']
48+
for key in override_at_class:
49+
context.setdefault(key, getattr(self, key))
50+
51+
assert context['map_srid'] == 4326, 'Leaflet vectors should be decimal degrees.'
4352

4453
# In BaseGeometryWidget, geom_type is set using gdal, and fails with generic.
54+
# https://github.com/django/django/blob/1.6.5/django/contrib/gis/forms/widgets.py#L73
4555
# See https://code.djangoproject.com/ticket/21021
46-
if self.geom_type == 'GEOMETRY':
47-
attrs['geom_type'] = 'Geometry'
48-
49-
map_id = attrs.get('id', name).replace('-', '_') # JS-safe
50-
attrs.update(id_map=map_id + '_map',
51-
id_map_callback=map_id + '_map_callback',
52-
modifiable=self.modifiable,
53-
geometry_field_class=attrs.get('geometry_field_class', 'L.GeometryField'),
54-
field_store_class=attrs.get('field_store_class', 'L.FieldStore'))
55-
return super(LeafletWidget, self).render(name, value, attrs)
56+
if context['geom_type'] == 'GEOMETRY':
57+
context['geom_type'] = 'Geometry'
58+
self.attrs['geom_type'] = context['geom_type']
59+
60+
return super(LeafletWidget, self).render(name, value, context)

0 commit comments

Comments
 (0)