MCPcopy Index your code
hub / github.com/erdem/django-map-widgets

github.com/erdem/django-map-widgets @v0.5.4

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.5.4 ↗ · + Follow
273 symbols 785 edges 68 files 11 documented · 4%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

CI PyPI version License Documentation Status

Django Map Widgets

Django Map Widgets is a package that provides highly configurable, pluggable, and user-friendly map widgets for GeoDjango form fields. It simplifies the integration of interactive maps into GeoDjango applications, enhancing the overall development experience.

The primary goal of Django Map Widgets is to bridge the gap between powerful GeoDjango functionality and user-friendly map interactions, creating a more accessible and enjoyable experience for both developers and end-users of GeoDjango-powered applications. Currently, the package supports Google, Mapbox, and Leaflet mapping platforms.

mapbox_interactive demo


Installation

pip install django-map-widgets

Add ‘mapwidgets’ to your INSTALLED_APPS in settings.py

INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    'django.contrib.staticfiles',

    'mapwidgets',
]

Ensure collectstatic Django admin command is run before using the widgets in production.

python manage.py collectstatic

Usage

Django Admin Usage

from django.contrib.gis.db import models
import mapwidgets


class CityAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.PointField: {"widget": mapwidgets.GoogleMapPointFieldWidget}
    }

Django Forms Usage

from mapwidgets.widgets import GoogleMapPointFieldWidget, MapboxPointFieldWidget


class CityForm(forms.ModelForm):
    class Meta:
        model = City
        fields = ("coordinates", "city_hall")
        widgets = {
            'coordinates': GoogleMapPointFieldWidget,
            'city_hall': MapboxPointFieldWidget,
        }


When the map widgets are used in Django web views with forms, Remember to include {{ form.media }} template tag in the view templates.

Settings

The JavaScript map rendering behavior of the widgets can be customized by providing MAP_WIDGETS config in the project's settings file. For detailed guidance on map customization options, check the settings guide.

GOOGLE_MAP_API_KEY = os.getenv("GOOGLE_MAP_API_KEY")
MAPBOX_ACCESS_TOKEN = os.getenv("MAPBOX_ACCESS_TOKEN")

MAP_WIDGETS = {
    "GoogleMap": {
        "apiKey": GOOGLE_MAP_API_KEY,
        "PointField": {
            "interactive": {
                "mapOptions": {
                    "zoom": 15,  # set initial zoom
                    "streetViewControl": False,
                },
                "GooglePlaceAutocompleteOptions": {
                    "componentRestrictions": {"country": "uk"}
                },
            }
        }
    },
    "Mapbox": {
        "accessToken": MAPBOX_ACCESS_TOKEN,
        "PointField": {
            "interactive": {
                "mapOptions": {"zoom": 12, "center": (51.515618, -0.091998)},
                "markerFitZoom": 14,
            }
        },
    },
    "Leaflet": {
        "PointField": {
            "interactive": {
                "mapOptions": {
                    "zoom": 12,
                    "scrollWheelZoom": False
                }
            }
        },
        "markerFitZoom": 14,
    }
}

JQuery Requirement

jQuery is required for Django Map Widgets to function in regular Django views. However, if the widgets is being used within the Django Admin, jQuery does not need to be provided separately. Any map widget class can be configured as described in the documentation, and they will work out of the box.

Preferable jQuery version is 3.7-slim.

Support

Django Map Widgets offers two types of widgets:

  1. Interactive (Dynamic) Widgets: These widgets allow users to interact with the map, such as clicking to set a location or dragging a marker. They are ideal for data input and editing scenarios.

  2. Static (Read-only) Widgets: These widgets display map data in a non-interactive format. They are useful for presenting location information without allowing modifications.

Widget Support Matrix

GeoDjango Field GoogleMap Mapbox Leaflet
Interactive Static Interactive Static Interactive Static
PointField N/A
LineStringField ✖️ ✖️ ✖️ ✖️ ✖️ N/A
PolygonField ✖️ ✖️ ✖️ ✖️ ✖️ N/A
MultiPointField ✖️ ✖️ ✖️ ✖️ ✖️ N/A
MultiLineStringField ✖️ ✖️ ✖️ ✖️ ✖️ N/A
MultiPolygonField ✖️ ✖️ ✖️ ✖️ ✖️ N/A

Contribution

Currently, the package supports Google, Mapbox, and Leaflet mapping platforms. If you have ideas for additional map providers or new features, or even if you want to help extend support to other GeoDjango form fields, feel free to do so. We would be happy to review and merge your contributions.

For more info how to contribute, please check out the contribution guidelines.

Screenshots

MapBox Interactive Point Field Widget

mapbox_interactive_preview

MapBox Static Point Field Widget

GoogleMap Interactive Point Field Widget

Leaflet Interactive Point Field Widget

and more...

Core symbols most depended-on inside this repo

Shape

Function 146
Class 66
Method 61

Languages

Python52%
TypeScript48%

Modules by API surface

demo/static/js/jquery-3.7.1.slim.min.js70 symbols
mapwidgets/static/mapwidgets/js/staticmap/mw_jquery.magnific-popup.min.js21 symbols
mapwidgets/static/mapwidgets/js/staticmap/mw_jquery.magnific-popup.js21 symbols
mapwidgets/widgets/base.py17 symbols
scripts.py12 symbols
mapwidgets/settings.py11 symbols
mapwidgets/widgets/mapbox.py10 symbols
mapwidgets/widgets/googlemap.py9 symbols
mapwidgets/utils.py9 symbols
mapwidgets/widgets/mixins.py8 symbols
demo/googlemap/models.py8 symbols
demo/mapbox/models.py7 symbols

For agents

$ claude mcp add django-map-widgets \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page