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
Чтобы настроить базовый слой, отображаемый в виджетах геометрии на основе 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/