es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo establecer default_lon y default_lat para la página de administrador utilizando GISModelAdmin.

¿Cómo se establecen los valores predeterminados de lon, defaultlat y default_zoom para un PointField en la página de administración de Django utilizando la clase GISModelAdmin?

Con el siguiente código, la página de administración carga correctamente, pero con la ubicación predeterminada en Europa.

model.py

from django.contrib.gis.db import models

class Enclosure(models.Model):
    location = models.PointField()
    name = models.CharField(max_length=15)

admin.py

from django.contrib.gis import admin

@admin.register(Enclosure)
class EnclosureAdmin(admin.GeoModelAdmin):
    pass

He intentado utilizar el siguiente código para establecer la latitud y longitud predeterminadas para el widget. Sin embargo, al hacer esto, no se muestra ningún mapa para el PointField en la página de administración.

admin.py

from django.contrib.gis import admin

@admin.register(Enclosure)
class EnclosureAdmin(admin.GeoModelAdmin):
    gis_widget_kwargs = {
        'attrs': {
            'default_lon': 40.383546,
            'default_lat': -111.774973,
        }
    }
}

El código relevante de Django es:

class GISModelAdmin(admin.GeoModelAdminMixin, admin.ModelAdmin):
    pass

class GeoModelAdminMixin:
    gis_widget = admin.OSMWidget
    gis_widget_kwargs = {}

    def formfield_for_dbfield(self, db_field, request, **kwargs):
        if (
            isinstance(db_field, models.GeometryField) and
            (db_field.dim < 3 or self.gis_widget.supports_3d)
        ):
            kwargs['widget'] = self.gis_widget(**self.gis_widget_kwargs)
            return db_field.formfield(**kwargs)
        else:
            return super().formfield_for_dbfield(db_field, request, **kwargs)

class OSMWidget(OpenLayersWidget):
    """
    Un widget basado en OpenLayers/OpenStreetMap.
    """
    template_name = 'gis/openlayers-osm.html'
    default_lon = 5
    default_lat = 47
    default_zoom = 12

    def __init__(self, attrs=None):
        super().__init__()
        for key in ('default_lon', 'default_lat', 'default_zoom'):
            self.attrs[key] = getattr(self, key)
        if attrs:
            self.attrs.update(attrs)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para configurar default_lon, default_lat y default_zoom para un PointField en la página de administración de Django utilizando la clase GISModelAdmin, es necesario definir gis_widget_kwargs en el archivo admin.py de la siguiente manera:

    from django.contrib.gis.db import models
    from django.contrib.gis import forms
    from django.contrib.gis.admin import GISModelAdmin
    from .models import Enclosure
    
    class EnclosureAdmin(GISModelAdmin):
        formfield_overrides = {
            models.PointField: {"widget": forms.OSMWidget(
                attrs={
                    "map_width": 800,
                    "map_height": 500,
                    "default_lon": -74.0059,
                    "default_lat": 40.7128,
                    "default_zoom": 10,
                }
            )}
        }
    admin.site.register(Enclosure, EnclosureAdmin)
    

    En el código anterior, utilizamos el widget de formulario OSMWidget y configuramos sus parámetros, incluyendo los valores default_lon, default_lat y default_zoom a los valores deseados. Luego utilizamos el atributo formfield_overrides para aplicar este widget al PointField en nuestro modelo.

    Es importante destacar que debemos importar las clases relevantes y definir el modelo Enclosure antes de definir la clase EnclosureAdmin.

Comments are closed.