{"title":"GeoDjango 表单 API","version":"6.0","locale":"zh-hans","docname":"ref/contrib/gis/forms-api","url":"/zh-hans/6.0/ref/contrib/gis/forms-api/","canonical":"https://djangodocs.dev/zh-hans/6.0/ref/contrib/gis/forms-api/","summary":"GeoDjango 提供了一些专门的表单字段和小部件，以便在地图上可视化显示和编辑地理位置数据。默认情况下，它们使用由 NASA 提供的基本 WMS 图层，并由 OpenLayers 驱动的地图。 字段参数 Link to this heading # 除了常规的 表单字段参数 之外，GeoDjango…","html":"<span id=\"geodjango-forms-api\"></span><h1>GeoDjango 表单 API<a class=\"heading-anchor\" href=\"#module-django.contrib.gis.forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>GeoDjango 提供了一些专门的表单字段和小部件，以便在地图上可视化显示和编辑地理位置数据。默认情况下，它们使用由 <a class=\"reference external\" href=\"https://www.earthdata.nasa.gov/\">NASA</a> 提供的基本 WMS 图层，并由 <a class=\"reference external\" href=\"https://openlayers.org/\">OpenLayers</a> 驱动的地图。</p>\n<section id=\"field-arguments\">\n<h2>字段参数<a class=\"heading-anchor\" href=\"#field-arguments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>除了常规的 <a class=\"reference internal\" href=\"/zh-hans/6.0/ref/forms/fields/#core-field-arguments\"><span class=\"std std-ref\">表单字段参数</span></a> 之外，GeoDjango 表单字段还接受以下可选参数。</p>\n<section id=\"srid\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">srid</span></code><a class=\"heading-anchor\" href=\"#srid\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.Field.srid\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Field.</span></span><span class=\"sig-name descname\"><span class=\"pre\">srid</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.Field.srid\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>这是字段值应该转换为的 SRID 代码。例如，如果地图小部件的 SRID 与您的应用程序或数据库通常使用的 SRID 不同，该字段将自动将输入值转换为该 SRID。</p>\n</dd></dl>\n\n</section>\n<section id=\"geom-type\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">geom_type</span></code><a class=\"heading-anchor\" href=\"#geom-type\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.Field.geom_type\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Field.</span></span><span class=\"sig-name descname\"><span class=\"pre\">geom_type</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.Field.geom_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>通常情况下，您不应该设置或更改该属性，它应该根据字段类进行设置。它与 OpenGIS 标准的几何名称相匹配。</p>\n</dd></dl>\n\n</section>\n<section id=\"max-geom-collections\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">max_geom_collections</span></code><a class=\"heading-anchor\" href=\"#max-geom-collections\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.Field.max_geom_collections\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Field.</span></span><span class=\"sig-name descname\"><span class=\"pre\">max_geom_collections</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.Field.max_geom_collections\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"5.2.17\">\n<p class=\"version-note-title\">New in Django 5.2.17</p></aside>\n<p>The maximum number of geometry collections the field accepts before\nrefusing to parse the input and raising a\n<a class=\"reference internal\" href=\"/zh-hans/6.0/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a>. This guards against crashes\nin the underlying GEOS library when parsing deeply nested\n<code class=\"docutils literal notranslate\"><span class=\"pre\">GEOMETRYCOLLECTION</span></code> input. It defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">198</span></code>.</p>\n<p>The limit is applied differently depending on the input format: for\nwell-known text (WKT) it bounds the nesting <em>depth</em>, while for well-known\nbinary (WKB and hex-encoded WKB) it bounds the <em>total</em> number of geometry\ncollections (both breadth and depth). As a result, the same value may\naccept a wide, shallow collection as WKT but reject it as WKB. For GeoJSON,\nthe limit is not applied at all, since GDAL parses that input type instead.</p>\n<p>Increase this value (or set to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>) only if you must accept\nlegitimately deep geometries, since doing so reduces protection against\nfatal errors.</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"form-field-classes\">\n<h2>表单字段类<a class=\"heading-anchor\" href=\"#form-field-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"geometryfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">GeometryField</span></code><a class=\"heading-anchor\" href=\"#geometryfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.GeometryField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">GeometryField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.GeometryField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"pointfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">PointField</span></code><a class=\"heading-anchor\" href=\"#pointfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.PointField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PointField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.PointField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"linestringfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">LineStringField</span></code><a class=\"heading-anchor\" href=\"#linestringfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.LineStringField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">LineStringField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.LineStringField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"polygonfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">PolygonField</span></code><a class=\"heading-anchor\" href=\"#polygonfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.PolygonField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PolygonField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.PolygonField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"multipointfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">MultiPointField</span></code><a class=\"heading-anchor\" href=\"#multipointfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.MultiPointField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">MultiPointField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.MultiPointField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"multilinestringfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">MultiLineStringField</span></code><a class=\"heading-anchor\" href=\"#multilinestringfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.MultiLineStringField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">MultiLineStringField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.MultiLineStringField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"multipolygonfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">MultiPolygonField</span></code><a class=\"heading-anchor\" href=\"#multipolygonfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.MultiPolygonField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">MultiPolygonField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.MultiPolygonField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n<section id=\"geometrycollectionfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">GeometryCollectionField</span></code><a class=\"heading-anchor\" href=\"#geometrycollectionfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.GeometryCollectionField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">GeometryCollectionField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.GeometryCollectionField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n</section>\n</section>\n<section id=\"module-django.contrib.gis.forms.widgets\">\n<span id=\"form-widgets\"></span><h2>表单部件<a class=\"heading-anchor\" href=\"#module-django.contrib.gis.forms.widgets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>GeoDjango 表单小部件允许您在可视地图上显示和编辑地理数据。请注意，目前没有任何可用的小部件支持 3D 几何形状，因此对于这种类型的数据，几何字段将使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Textarea</span></code> 小部件作为回退。</p>\n<section id=\"widget-attributes\">\n<h3>表单属性<a class=\"heading-anchor\" href=\"#widget-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>GeoDjango 的小部件是基于模板的，因此它们的属性大部分与其他 Django 小部件的属性不同。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.BaseGeometryWidget.base_layer\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseGeometryWidget.</span></span><span class=\"sig-name descname\"><span class=\"pre\">base_layer</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget.base_layer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"6.0\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<p>A string that specifies the identifier for the default base map layer to be\nused by the corresponding JavaScript map widget. It is passed as part of\nthe widget options when rendering, allowing the <code class=\"docutils literal notranslate\"><span class=\"pre\">MapWidget</span></code> to determine\nwhich map tile provider or base layer to initialize (default is <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>).</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.BaseGeometryWidget.geom_type\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseGeometryWidget.</span></span><span class=\"sig-name descname\"><span class=\"pre\">geom_type</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget.geom_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>OpenGIS 几何类型，通常由表单字段设置。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.BaseGeometryWidget.map_srid\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseGeometryWidget.</span></span><span class=\"sig-name descname\"><span class=\"pre\">map_srid</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget.map_srid\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>地图使用的 SRID 代码（默认为 4326）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.BaseGeometryWidget.display_raw\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseGeometryWidget.</span></span><span class=\"sig-name descname\"><span class=\"pre\">display_raw</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget.display_raw\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>布尔值，指定是否可见一个文本区域输入框，显示当前几何形状的序列化表示，主要用于调试目的（默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.BaseGeometryWidget.supports_3d\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseGeometryWidget.</span></span><span class=\"sig-name descname\"><span class=\"pre\">supports_3d</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget.supports_3d\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指示小部件是否支持编辑 3D 数据的属性（默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.BaseGeometryWidget.template_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BaseGeometryWidget.</span></span><span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>用于呈现地图小部件的模板。</p>\n</dd></dl>\n\n<p>您可以以与任何其他 Django 小部件相同的方式传递小部件属性。例如：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyGeoForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">point</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">PointField</span><span class=\"p\">(</span><span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">OSMWidget</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;display_raw&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}))</span>\n</code></pre></div>\n</section>\n<section id=\"widget-classes\">\n<h3>部件类<a class=\"heading-anchor\" href=\"#widget-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">BaseGeometryWidget</span></code></p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.BaseGeometryWidget\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">BaseGeometryWidget</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This is an abstract base widget containing the logic needed by subclasses.\nYou cannot directly use this widget for a geometry field.\nNote that the rendering of GeoDjango widgets is based on a base layer name,\nidentified by the <a class=\"reference internal\" href=\"#django.contrib.gis.forms.widgets.BaseGeometryWidget.base_layer\" title=\"django.contrib.gis.forms.widgets.BaseGeometryWidget.base_layer\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">base_layer</span></code></a> class attribute.</p>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">OpenLayersWidget</span></code></p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OpenLayersWidget\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">OpenLayersWidget</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OpenLayersWidget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This is the default widget used by all GeoDjango form fields. Attributes\nare:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OpenLayersWidget.base_layer\">\n<span class=\"sig-name descname\"><span class=\"pre\">base_layer</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OpenLayersWidget.base_layer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"6.0\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">nasaWorldview</span></code></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OpenLayersWidget.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OpenLayersWidget.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">gis/openlayers.html</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OpenLayersWidget.map_srid\">\n<span class=\"sig-name descname\"><span class=\"pre\">map_srid</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OpenLayersWidget.map_srid\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">3857</span></code></p>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">OpenLayersWidget</span></code> and <a class=\"reference internal\" href=\"#django.contrib.gis.forms.widgets.OSMWidget\" title=\"django.contrib.gis.forms.widgets.OSMWidget\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OSMWidget</span></code></a> include the <code class=\"docutils literal notranslate\"><span class=\"pre\">ol.js</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ol.css</span></code> files hosted on the <code class=\"docutils literal notranslate\"><span class=\"pre\">cdn.jsdelivr.net</span></code> content-delivery\nnetwork. These files can be overridden by subclassing the widget and\nsetting the <code class=\"docutils literal notranslate\"><span class=\"pre\">js</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">css</span></code> properties of the inner <code class=\"docutils literal notranslate\"><span class=\"pre\">Media</span></code> class (see\n<a class=\"reference internal\" href=\"/zh-hans/6.0/topics/forms/media/#assets-as-a-static-definition\"><span class=\"std std-ref\">资源作为静态定义</span></a>).</p>\n<aside class=\"admonition-external-assets-with-csp admonition\">\n<p class=\"admonition-title\">External assets with CSP</p>\n<p>When <a class=\"reference internal\" href=\"/zh-hans/6.0/ref/middleware/#django.middleware.csp.ContentSecurityPolicyMiddleware\" title=\"django.middleware.csp.ContentSecurityPolicyMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ContentSecurityPolicyMiddleware</span></code></a> is\nenabled, the default OpenLayers CDN assets (<code class=\"docutils literal notranslate\"><span class=\"pre\">ol.js</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">ol.css</span></code>)\nwill be blocked unless explicitly allowed. This can be addressed in one\nof two ways: <strong>serve assets locally</strong> by subclassing the widget and\nprovide local copies of the JavaScript and CSS files, or\n<strong>allow the CDN in the CSP policy</strong>.</p>\n<p>For example, to allow the default NASA Worldview base layer (replace\n<code class=\"docutils literal notranslate\"><span class=\"pre\">x.y.z</span></code> with the actual version):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.csp</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CSP</span>\n\n<span class=\"n\">SECURE_CSP</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">],</span>\n    <span class=\"s2\">&quot;script-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">,</span> <span class=\"s2\">&quot;https://cdn.jsdelivr.net/npm/ol@x.y.z/dist/ol.js&quot;</span><span class=\"p\">],</span>\n    <span class=\"s2\">&quot;style-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">,</span> <span class=\"s2\">&quot;https://cdn.jsdelivr.net/npm/ol@x.y.z/ol.css&quot;</span><span class=\"p\">],</span>\n    <span class=\"s2\">&quot;img-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">,</span> <span class=\"s2\">&quot;https://*.earthdata.nasa.gov&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</aside>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">OSMWidget</span></code></p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OSMWidget\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">OSMWidget</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OSMWidget\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This widget specialized <a class=\"reference internal\" href=\"#django.contrib.gis.forms.widgets.OpenLayersWidget\" title=\"django.contrib.gis.forms.widgets.OpenLayersWidget\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OpenLayersWidget</span></code></a> and uses an OpenStreetMap\nbase layer to display geographic objects on. Attributes are:</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OSMWidget.base_layer\">\n<span class=\"sig-name descname\"><span class=\"pre\">base_layer</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OSMWidget.base_layer\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"6.0\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">osm</span></code></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OSMWidget.default_lat\">\n<span class=\"sig-name descname\"><span class=\"pre\">default_lat</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OSMWidget.default_lat\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OSMWidget.default_lon\">\n<span class=\"sig-name descname\"><span class=\"pre\">default_lon</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OSMWidget.default_lon\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认的中心纬度和经度分别是 <code class=\"docutils literal notranslate\"><span class=\"pre\">47</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">5</span></code>，这是法国东部的一个位置。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.gis.forms.widgets.OSMWidget.default_zoom\">\n<span class=\"sig-name descname\"><span class=\"pre\">default_zoom</span></span><a class=\"heading-anchor\" href=\"#django.contrib.gis.forms.widgets.OSMWidget.default_zoom\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认的地图缩放级别是 <code class=\"docutils literal notranslate\"><span class=\"pre\">12</span></code>。</p>\n</dd></dl>\n\n<p>The <a class=\"reference internal\" href=\"#django.contrib.gis.forms.widgets.OpenLayersWidget\" title=\"django.contrib.gis.forms.widgets.OpenLayersWidget\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OpenLayersWidget</span></code></a> note about using external assets also applies\nhere. See also this <a class=\"reference external\" href=\"https://help.openstreetmap.org/questions/10920/how-to-embed-a-map-in-my-https-site\">FAQ answer</a> about <code class=\"docutils literal notranslate\"><span class=\"pre\">https</span></code> access to map tiles.</p>\n<aside class=\"admonition-openstreetmap-tiles-with-csp admonition\">\n<p class=\"admonition-title\">OpenStreetMap tiles with CSP</p>\n<p>This widget uses OpenStreetMap tiles instead of NASA Worldview. If\n<a class=\"reference internal\" href=\"/zh-hans/6.0/topics/security/#security-csp\"><span class=\"std std-ref\">Content Security Policy</span></a> enabled, both the OpenLayers CDN resources (as\nrequired by <a class=\"reference internal\" href=\"#django.contrib.gis.forms.widgets.OpenLayersWidget\" title=\"django.contrib.gis.forms.widgets.OpenLayersWidget\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OpenLayersWidget</span></code></a>) and the OpenStreetMap tile\nservers must be allowed:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.csp</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CSP</span>\n\n<span class=\"n\">SECURE_CSP</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># other directives</span>\n    <span class=\"s2\">&quot;img-src&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">CSP</span><span class=\"o\">.</span><span class=\"n\">SELF</span><span class=\"p\">,</span> <span class=\"s2\">&quot;https://tile.openstreetmap.org&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"6.0\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">OSMWidget</span></code> no longer uses a custom template. Consequently, the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">gis/openlayers-osm.html</span></code> template was removed.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"customizing-the-base-layer-used-in-openlayers-based-widgets\">\n<span id=\"geometry-widgets-customization\"></span><h3>Customizing the base layer used in OpenLayers-based widgets<a class=\"heading-anchor\" href=\"#customizing-the-base-layer-used-in-openlayers-based-widgets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"6.0\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<p>To customize the base layer displayed in OpenLayers-based geometry widgets,\ndefine a new layer builder in a custom JavaScript file. For example:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"javascript\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">path-to-file.js</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"w\"> </span><span class=\"nx\">MapWidget</span><span class=\"p\">.</span><span class=\"nx\">layerBuilder</span><span class=\"p\">.</span><span class=\"nx\">custom_layer_name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kd\">function</span><span class=\"w\"> </span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">     </span><span class=\"c1\">// Return an OpenLayers layer instance.</span>\n<span class=\"w\">     </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"ow\">new</span><span class=\"w\"> </span><span class=\"nx\">ol</span><span class=\"p\">.</span><span class=\"nx\">layer</span><span class=\"p\">.</span><span class=\"nx\">Tile</span><span class=\"p\">({</span><span class=\"nx\">source</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"ow\">new</span><span class=\"w\"> </span><span class=\"nx\">ol</span><span class=\"p\">.</span><span class=\"nx\">source</span><span class=\"p\">.</span><span class=\"o\">&lt;</span><span class=\"nx\">ChosenSource</span><span class=\"o\">&gt;</span><span class=\"p\">()});</span>\n<span class=\"w\"> </span><span class=\"p\">};</span>\n</code></pre></figure>\n<p>Then, subclass a standard geometry widget and set the <code class=\"docutils literal notranslate\"><span class=\"pre\">base_layer</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis.forms.widgets</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">OpenLayersWidget</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">YourCustomWidget</span><span class=\"p\">(</span><span class=\"n\">OpenLayersWidget</span><span class=\"p\">):</span>\n    <span class=\"n\">base_layer</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;custom_layer_name&quot;</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Media</span><span class=\"p\">:</span>\n        <span class=\"n\">js</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;path-to-file.js&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</section>\n</section>","rootId":"module-django.contrib.gis.forms","toc":[{"title":"字段参数","anchor":"field-arguments","children":[{"title":"srid","anchor":"srid","children":[]},{"title":"geom_type","anchor":"geom-type","children":[]},{"title":"max_geom_collections","anchor":"max-geom-collections","children":[]}]},{"title":"表单字段类","anchor":"form-field-classes","children":[{"title":"GeometryField","anchor":"geometryfield","children":[]},{"title":"PointField","anchor":"pointfield","children":[]},{"title":"LineStringField","anchor":"linestringfield","children":[]},{"title":"PolygonField","anchor":"polygonfield","children":[]},{"title":"MultiPointField","anchor":"multipointfield","children":[]},{"title":"MultiLineStringField","anchor":"multilinestringfield","children":[]},{"title":"MultiPolygonField","anchor":"multipolygonfield","children":[]},{"title":"GeometryCollectionField","anchor":"geometrycollectionfield","children":[]}]},{"title":"表单部件","anchor":"module-django.contrib.gis.forms.widgets","children":[{"title":"表单属性","anchor":"widget-attributes","children":[]},{"title":"部件类","anchor":"widget-classes","children":[]},{"title":"Customizing the base layer used in OpenLayers-based widgets","anchor":"customizing-the-base-layer-used-in-openlayers-based-widgets","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.0/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/6.0/ref/contrib/"},{"docname":"ref/contrib/gis/index","title":"GeoDjango","url":"/zh-hans/6.0/ref/contrib/gis/"}],"prev":{"docname":"ref/contrib/gis/db-api","title":"GeoDjango 数据库 API","url":"/zh-hans/6.0/ref/contrib/gis/db-api/"},"next":{"docname":"ref/contrib/gis/geoquerysets","title":"GIS QuerySet API 参考","url":"/zh-hans/6.0/ref/contrib/gis/geoquerysets/"},"formats":{"html":"/zh-hans/6.0/ref/contrib/gis/forms-api/","markdown":"/zh-hans/6.0/ref/contrib/gis/forms-api.md","json":"/zh-hans/6.0/ref/contrib/gis/forms-api.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/ref/contrib/gis/forms-api.txt","official":"https://docs.djangoproject.com/zh-hans/6.0/ref/contrib/gis/forms-api/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}