Mapas desde el admin Django

imagen / Aaditya Arora
  
13 de Noviembre de 2017   0  

Django cuenta con un ecosistema impresionando de librerías y herramientas que permiten extender su funcionalidad y con ello, continúa fielmente con su lema "The web framework for perfectionists with deadlines." que en español es algo así como "El framework web para perfeccionistas con límites de tiempo". 

El día de hoy les vengo a presentar una librería muy interesante que conocí y que puede ser de gran ayuda en tu proyecto GIS en el cual estas trabajando actualmente o que trabarás a futuro. Esta herramienta se llama: Django Map Widgets.

Django Map Widgets. 

Esta librería te permite configurar tipo "plug and play" nuevos widgets para trabajar de manera más amigable los campos PostGIS desde tu proyecto Django utilizando widgets tipo mapa.

A continuación te presento un ejemplo de cómo funciona para almacenar información de un PointField. 

 

Instalación. 

Es muy sencillo instalar, solamente necesitamos ejecutar lo siguiente: 

$ pip install django-map-widgets

Posteriormente agregamos la app a la lista de "INSTALLED_APPS":

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

    'mapwidgets',
]

Si necesitas utilizarlo desde algún HTML renderizado, se tendrá que agregar la variable {{form.media}} en el HEAD de nuestro template:
 

<!DOCTYPE html>
<html>
<head>
  ...
  {{ form.media }}
</head>
<body>
...
</body>
</html>

 

Requerimientos. 

Django Widget Maps depende del uso de Jquery el cual no es necesario integrar si solo utilizamos en nuestras vistas del Admin nativo de Django. 

 

Configuraciones:

Las configuraciones disponibles son las siguientes: 


GOOGLE_MAP_API_KEY: (Requerido) Agregamos nuestro GOOGLE API KEY 
GOOGLE_MAP_API_SIGNATURE: Para los mapas estáticos, agregar este API SIGNATURE KEY (Opcional)
LANGUAGE: Lenguaje del mapa, por default es inglés (en).
mapCenterLocationName: Podemos proporcionar una ubicación específica para centrar el mapa al momento de cargarlo. Opcional
mapCenterLocation: Podemos proporcionar coordenadas para centrar el mapa mediante una lista del tipo [latitude, longitude]. Esto es opcional.
zoom : Zoom en el cual deseamos cargar el mapa, el default es 6.
markerFitZoom : Este método setea el nivel de zoom a una distancia zaronable y centra el marcador en el mapa.

Uso de las configuraciones. 

En nuestro archivo settings.py agregamos una constante llamada "MAP_WIDGETS" el cual de manera básica puede estar de la siguiente manera: 

MAP_WIDGETS = {
    "GooglePointFieldWidget": (
        ("zoom", 15),
        ("mapCenterLocationName", "london"),
        ("GooglePlaceAutocompleteOptions", {'componentRestrictions': {'country': 'uk'}}),
        ("markerFitZoom", 12),
    ),
    "GOOGLE_MAP_API_KEY": "<google-api-key>"
}

Django Admin.

Para utilizar el widget en nuestro admin, especificamos que deseamos utilizar el widget en nuestro campo PointField, sobreescribiendo el widget nativo y transformándolo en un GooglePointFieldWidget:

from mapwidgets.widgets import GooglePointFieldWidget

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

Si deseamos tener diferentes configuraciones para cada modelo, podemos realizarlo de la siguiente manera: 

from django.contrib.gis import forms
from mapwidgets.widgets import GooglePointFieldWidget

CUSTOM_MAP_SETTINGS = {
    "GooglePointFieldWidget": (
        ("zoom", 15),
        ("mapCenterLocation", [60.7177013, -22.6300491]),
    ),
}

class CityAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.PointField: {"widget": GooglePointFieldWidget(settings=CUSTOM_MAP_SETTINGS)}
    }

Django Admin Inlines. 

Para utilizar este widget en elementos inline, utilizamos la siguiente configuración: 

from mapwidgets.widgets import GooglePointFieldInlineWidget

class DistrictAdminInline(admin.TabularInline):
    model = District
    extra = 3
    formfield_overrides = {
        models.PointField: {"widget": GooglePointFieldInlineWidget}
    }

class CityAdmin(admin.ModelAdmin):
    inlines = (DistrictAdminInline,)

Esto nos dará como resultado lo siguiente: 

Espero que les haya gustado y que les sea de gran utilizar en sus proyectos Django. Si ya lo has utilizado anteriormente, déjanos tus comentarios y cuéntanos tus experiencias :D

 

Fuente: https://github.com/erdem/django-map-widgets

 

 



Alex Dzul

FullStack Python / Django Developer. #jslove

Etiquetas

Temas relacionados