Spec-Zone.ru › Django 6.0

API форм GeoDjango

GeoDjango предоставляет специализированные поля форм и виджеты для визуального отображения и редактирования геолокализованных данных на карте. По умолчанию они используют карты на базе OpenLayers с базовым слоем WMS от NASA.

Аргументы полей

Помимо стандартных аргументов полей форм, поля форм GeoDjango принимают следующие необязательные аргументы.

srid

Field.srid

Это код SRID, к которому должно быть преобразовано значение поля. Например, если SRID виджета карты отличается от SRID, который обычно используется в вашем приложении или базе данных, поле автоматически преобразует введённые значения к этому SRID.

geom_type

Field.geom_type

Как правило, вам не нужно задавать или изменять этот атрибут: его значение должно определяться классом поля. Оно соответствует имени геометрии по стандарту OpenGIS.

Классы полей форм

GeometryField

class GeometryField [исходный код]

PointField

class PointField [исходный код]

LineStringField

class LineStringField [исходный код]

PolygonField

class PolygonField [исходный код]

MultiPointField

class MultiPointField [исходный код]

MultiLineStringField

class MultiLineStringField [исходный код]

MultiPolygonField

class MultiPolygonField [исходный код]

GeometryCollectionField

class GeometryCollectionField [исходный код]

Виджеты форм

Виджеты форм GeoDjango позволяют отображать и редактировать географические данные на визуальной карте. Обратите внимание, что ни один из доступных на данный момент виджетов не поддерживает трёхмерные геометрии, поэтому для таких данных поля геометрии будут использовать виджет Textarea.

Атрибуты виджетов

Виджеты GeoDjango основаны на шаблонах, поэтому их атрибуты в основном отличаются от атрибутов других виджетов Django.

BaseGeometryWidget.base_layer
Добавлено в Django 6.0.

Строка, задающая идентификатор базового слоя карты, который будет использоваться соответствующим виджетом карты JavaScript. Она передаётся в составе параметров виджета при отображении и позволяет MapWidget определить, какого поставщика картографических тайлов или базовый слой инициализировать (по умолчанию — None).

BaseGeometryWidget.geom_type

Тип геометрии OpenGIS, обычно задаваемый полем формы.

BaseGeometryWidget.map_srid

Код SRID, используемый картой (по умолчанию — 4326).

BaseGeometryWidget.display_raw

Логическое значение, указывающее, отображается ли поле ввода textarea с сериализованным представлением текущей геометрии, главным образом для целей отладки (по умолчанию — False).

BaseGeometryWidget.supports_3d

Указывает, поддерживает ли виджет редактирование трёхмерных данных (по умолчанию — False).

BaseGeometryWidget.template_name

Шаблон, используемый для отображения виджета карты.

Атрибуты виджета можно передавать так же, как и для любого другого виджета Django. Например:

from django.contrib.gis import forms


class MyGeoForm(forms.Form):
    point = forms.PointField(widget=forms.OSMWidget(attrs={"display_raw": True}))

Классы виджетов

BaseGeometryWidget

class BaseGeometryWidget [исходный код]

Это абстрактный базовый виджет, содержащий логику, необходимую подклассам. Нельзя напрямую использовать этот виджет для поля геометрии. Обратите внимание, что отображение виджетов GeoDjango основано на имени базового слоя, задаваемом атрибутом класса base_layer.

OpenLayersWidget

class OpenLayersWidget [исходный код]

Это виджет по умолчанию, используемый всеми полями форм GeoDjango. Его атрибуты:

base_layer
Добавлено в Django 6.0.

nasaWorldview

template_name

gis/openlayers.html.

map_srid

3857

OpenLayersWidget и OSMWidget включают файлы ol.js и ol.css, размещённые в сети доставки контента cdn.jsdelivr.net. Эти файлы можно переопределить, создав подкласс виджета и задав свойства js и css внутреннего класса Media (см. Ресурсы как статическое определение).

Внешние ресурсы при использовании CSP

Если включён ContentSecurityPolicyMiddleware, ресурсы OpenLayers из CDN по умолчанию (ol.js и ol.css) будут заблокированы, если явно не разрешить их использование. Это можно решить одним из двух способов: размещать ресурсы локально, создав подкласс виджета и предоставив локальные копии файлов JavaScript и CSS, или разрешить CDN в политике CSP.

Например, чтобы разрешить базовый слой NASA Worldview по умолчанию (замените x.y.z фактической версией):

from django.utils.csp import CSP

SECURE_CSP = {
    "default-src": [CSP.SELF],
    "script-src": [CSP.SELF, "https://cdn.jsdelivr.net/npm/ol@x.y.z/dist/ol.js"],
    "style-src": [CSP.SELF, "https://cdn.jsdelivr.net/npm/ol@x.y.z/ol.css"],
    "img-src": [CSP.SELF, "https://*.earthdata.nasa.gov"],
}

OSMWidget

class OSMWidget [исходный код]

Этот специализированный виджет расширяет OpenLayersWidget и использует базовый слой OpenStreetMap для отображения географических объектов. Его атрибуты:

base_layer
Добавлено в Django 6.0.

osm

default_lat
default_lon

По умолчанию широта и долгота центра карты равны 47 и 5 соответственно; это местоположение в восточной Франции.

default_zoom

Масштаб карты по умолчанию — 12.

Приведённое в примечании к виджету OpenLayersWidget замечание об использовании внешних ресурсов также применимо здесь. См. также ответ на часто задаваемый вопрос о доступе к тайлам карты через https.

Тайлы OpenStreetMap при использовании CSP

Этот виджет использует тайлы OpenStreetMap вместо NASA Worldview. Если включена политика безопасности содержимого, необходимо разрешить ресурсы CDN OpenLayers (требуемые для OpenLayersWidget), а также серверы тайлов OpenStreetMap:

from django.utils.csp import CSP

SECURE_CSP = {
    # other directives
    "img-src": [CSP.SELF, "https://tile.openstreetmap.org"],
}
Изменено в Django 6.0:

OSMWidget больше не использует специальный шаблон. В результате шаблон gis/openlayers-osm.html был удалён.

Настройка базового слоя в виджетах на основе OpenLayers

Добавлено в Django 6.0.

Чтобы настроить базовый слой, отображаемый в виджетах геометрии на основе OpenLayers, определите новый построитель слоя в пользовательском файле JavaScript. Например:

path-to-file.js
 MapWidget.layerBuilder.custom_layer_name = function () {
     // Return an OpenLayers layer instance.
     return new ol.layer.Tile({source: new ol.source.<ChosenSource>()});
 };

Затем создайте подкласс стандартного виджета геометрии и задайте base_layer:

from django.contrib.gis.forms.widgets import OpenLayersWidget


class YourCustomWidget(OpenLayersWidget):
    base_layer = "custom_layer_name"

    class Media:
        js = ["path-to-file.js"]

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/contrib/gis/forms-api/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API