gpt4 book ai didi

django - GeoDjango 从表单中保存点几何图形

转载 作者:行者123 更新时间:2023-12-01 22:17:58 24 4
gpt4 key购买 nike

我的 django 项目中有一个表单和一个表单集。该表单有一个带有点几何图形的输入。所以我在那里输入了看起来像这样的内容:

39.237103, 25.667217

当用户发送表单时,我想分割此输入并将其保存为点几何图形,在模型中点看起来像这样:

position = gismodels.PointField(null=True, srid=4326)

我使用此代码来验证和保存表单、表单集和点几何图形

if request.method == "POST":
checklist_form = ChecklistForm(request.POST)
observation_formset = ObservationFormSet(request.POST)

#error
if checklist_form.is_valid() and observation_formset.is_valid():
checklist = checklist_form.save(commit=False)
latitude, longitude = request.POST.get('position', '').split(', ', 1)
checklist.position = Point(longitude, latitude)
checklist.save()
for observation_form in observation_formset:
observation = observation_form.save(commit=False)
observation.checklist_id = checklist
observation.save()

但问题是位置的 POST 数据格式错误,因此 checklist_form 的验证会在我分割坐标之前引发此错误:

String or unicode input unrecognized as WKT EWKT, and HEXEWKB.

我读到我可以复制 POST 数据并更改它们,但我也读到这是一个不好的做法。我的想法是使用 javascript 来更改适当格式的坐标,但 GeoDjango 肯定具有更好的保存点几何图形的功能。

最佳答案

这是一个使用 django 输入或编辑 Point 的简单字段:

import re
from django.contrib.gis import forms
from django.contrib.gis.geos import Point
from django.core.exceptions import ValidationError
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _


class SimplePointField(forms.Field):
default_error_messages = {
'invalid': _('Enter latitude,longitude'),
}
re_point = re.compile(r'^\s*(-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)\s*$')

def prepare_value(self, value):
if isinstance(value, Point):
return "{},{}".format(*value.coords)
return value

def to_python(self, value):
"""
Validates input. Returns a Point instance or None for empty values.
"""
value = super(SimplePointField, self).to_python(value)
if value in self.empty_values:
return None
try:
m = self.re_point.match(force_text(value))
if not m:
raise ValueError()
value = Point(float(m.group(1)), float(m.group(2)))
except (ValueError, TypeError):
raise ValidationError(self.error_messages['invalid'],
code='invalid')

return value

# usage exmaple:
class MyForm(forms.Form):
point = SimplePointField() # this one is required
other_point = SimplePointField(required=False) # can stay blank

关于django - GeoDjango 从表单中保存点几何图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41524036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com